gpt4 book ai didi

cocoa - NSBrowser 重用单元而不是创建新单元

转载 作者:行者123 更新时间:2023-12-03 17:56:02 25 4
gpt4 key购买 nike

我正在尝试使用 NSBrowser 创建 UI 元素,但由于某种原因,浏览器创建我指定的自定义单元格类的单例实例,而不是为每个单元格创建新的单元格实例在浏览器中。特别是,这是委托(delegate)实现

- (void)awakeFromNib {
[super awakeFromNib];

self.browser.target = self;
self.browser.doubleAction = @selector(_doubleClick:);
self.browser.reusesColumns = YES;
// self.browser.cellClass = [CLColumnViewCell class];
[self.browser setCellPrototype:[[CLColumnViewCell alloc] init]];
}

#pragma mark NSBrowserDelegate

- (void)browser:(NSBrowser *)browser createRowsForColumn:(NSInteger)column inMatrix:(NSMatrix *)matrix {
NSLog(@"This method never gets called");
}

- (NSInteger)browser:(NSBrowser *)browser numberOfChildrenOfItem:(id)item {
return [(item ?: _root) countOfContents];
}

- (BOOL)browser:(NSBrowser *)browser isLeafItem:(id)item {
return ![(item ?: _root) canHaveContents];
}

- (id)browser:(NSBrowser *)browser child:(NSInteger)index ofItem:(id)item {
return [(item ?: _root) objectInContentsAtIndex:index];
}

- (id)browser:(NSBrowser *)browser objectValueForItem:(id)item {
return nil; // Object value is handled by CLColumnViewCell itself.
}

- (void)browser:(NSBrowser *)browser willDisplayCell:(CLColumnViewCell *)cell atRow:(NSInteger)row column:(NSInteger)column {
NSIndexPath *indexPath = [[browser indexPathForColumn:column] indexPathByAddingIndex:row];
cell.columnView = browser;
cell.indexPath = indexPath;
cell.object = [browser itemAtIndexPath:indexPath];
NSLog(@"will display cell %@", cell, cell);
}

日志消息如下所示

2012-11-11 09:57:16.582 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.583 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.583 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.584 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.584 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.585 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.585 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.586 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.587 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.587 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.588 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.588 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.589 will diplay cell <CLColumnViewCell: 0x102e597c0>
2012-11-11 09:57:16.589 will diplay cell <CLColumnViewCell: 0x102e597c0>

如消息所示,同一个单元实例被一遍又一遍地使用!有没有一种方法可以强制 NSBrowser 创建新的单元格实例而不是重复使用相同的单元格实例?

最佳答案

不是真的。毕竟,这是 the whole point of NSCell 。 NSCell 是 NSView 的轻量级替代品。在过去性能受到更多限制的日子里,这一点更为重要——事实上,正如您会注意到的那样,Apple 已经开始为以前的单元格密集型控件(如 NSTableView 和 NSOutlineView)制作基于 NSView 的替代品。我猜他们还没有抽出时间来做一个基于 NSView 的 NSBrowser。 (虽然查看 NSTableView API,很容易明白原因 - 改造有点笨拙。他们可能会更好地简单地重新开始。但我离题了......)

简而言之,考虑到 NSCell 的整个想法是拥有一个可以重用的轻量级对象,而不是每次都必须重新分配一个新对象,如果有一种简单的方法让它创建一个新的对象,我会感到惊讶。每次都有新的。您也许可以通过子类化 NSBrowser 来解决此行为,但您最好采用不同的方法。

关于cocoa - NSBrowser 重用单元而不是创建新单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13333829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com