我正在尝试使用NSBrowser
创建一个UI元素,但由于某种原因,浏览器会创建我指定的自定义单元类的单例实例,而不是为浏览器中的每个单元格创建新的单元格实例。特别是,这是委托实现
- (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
创建新的单元格实例而不是重用相同的实例?
答案 0 :(得分:1)
不是真的。毕竟,这是the whole point of NSCell。 NSCells是NSViews的轻量级替代品。这在以前更受性能限制的日子里更为重要 - 事实上,正如你所注意到的那样,Apple已经开始为以前的细胞密集型控件(如NSTableView和NSOutlineView)制作基于NSView的替代品。我猜他们还没有去做一个基于NSView的NSBrowser。 (虽然看看NSTableView API,但很容易理解为什么 - 改造很笨拙。他们可能只是重新开始。但我离题了......)
简而言之,鉴于NSCell的整个想法是拥有一个可以重复使用的轻量级对象,而不是每次都必须重新分配一个新对象,如果有一种简单的方法可以让它成为一个新的,我会感到惊讶每次都有新的。您可以通过继承NSBrowser来破解这种行为,但是你可能最好采用不同的方法。