首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSBrowser重用单元而不是创建新单元

NSBrowser重用单元而不是创建新单元
EN

Stack Overflow用户
提问于 2012-11-12 02:00:18
回答 1查看 379关注 0票数 0

我试图使用NSBrowser创建一个UI元素,但由于某些原因,浏览器会创建我指定的自定义单元格类的一个单例实例,而不是在浏览器中为每个单元格创建新的单元格实例。特别地,下面是委托实现

代码语言:javascript
复制
- (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);
}

日志消息如下所示

代码语言:javascript
复制
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>

如消息所示,同一个cell实例被反复使用!有没有办法强制NSBrowser创建新的单元实例,而不是重用相同的单元实例?

EN

回答 1

Stack Overflow用户

发布于 2013-02-13 08:04:32

不怎么有意思。毕竟,这是the whole point of NSCell。NSCells是NSViews的轻量级替代品。在过去性能受限的日子里,这一点更加重要--事实上,正如你所注意到的,苹果已经开始为以前的电池密集型控件,如NSTableView和NSOutlineView,开发基于NSView的替代品。我猜他们还没来得及做一个基于NSView的NSBrowser。(尽管看一下NSTableView应用程序接口,很容易理解为什么--改进有点笨拙。他们可能会更好的简单地重新开始。,但我离题了…)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13333829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档