小编def*_*ott的帖子

如何使NSTableView不重用TableCellViews

我希望我的基于视图的NSTableview不会重复使用滚动超出范围的以前生成的TableCellViews.我认为这可以通过覆盖dequeueReusableCellWithIdentifier来使用UITableView:返回nil.我有类似的NSTableView解决方案吗?

-

我的背景:我有一个非常复杂的基于视图的tableView以通常的方式绑定到ManagedObjects(即table-content,-selection和-sortdescriptor绑定到arraycontroller,tableCellView-elements绑定到objectValue).

该表有大约20列,但最多400行.滚动速度非常慢,但时间分析表明没有单一的缓慢来源(最大的单一方法调用占用大约5%的时间).在缓存了我的ManagedObject的派生/自定义属性而没有太多性能提升之后,我现在正在尝试缓存视图(以避免在视图进入范围时频繁重新绑定tablecellViews).

我目前正在尝试的是不绑定表内容,而是使用NSDatasource协议获取我的视图.在那里

-(NSView*) tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
Run Code Online (Sandbox Code Playgroud)

我想返回缓存的TableCellViews(如果它们存在).否则我会通过创建一个新的

[self.table makeViewWithIdentifier:... owner:self];
Run Code Online (Sandbox Code Playgroud)

由于makeViewWithIdentifier可能会返回已经被我缓存的视图,因此表内容会被错误的单元格搞乱.

这种方法的性能明显更好......

-

关于使滚动性能更高效的其他想法也很受欢迎.

macos cocoa nstableview

7
推荐指数
1
解决办法
2224
查看次数

在编辑了具有内容绑定的NSTableView之后,实体模式下的NSArrayController未更新

我有一个配置了模式'Entity'的NSArrayController,它包含所选类型为'Person'和'Prepares Content'的Core-Data-Entities.所有其他属性都是默认属性.正如所料,当我创建新的Person-entities时(通过按钮单击),此arraycontroller更新其arrangeObjects:

-(IBAction)addEntity:(id)sender{
  Person* new = [NSEntityDescription insertNewObjectForEntityForName:@"Person"
                           inManagedObjectContext:[self managedObjectContext]];
  new.text = @"text";
  new.date = [NSDate date];
}
Run Code Online (Sandbox Code Playgroud)

我已将基于视图的NSTableView的内容绑定到此arrayController的'arrangeObjects'属性,以显示Persons.在一列中,我有一个可编辑的(但默认情况下是默认的)NSTextField绑定到TableCellView的'objectValue.text'属性.

如果我编辑表格中的"文本"属性并添加另一个人(当表格单元格仍处于编辑模式时),则表格失去焦点,编辑结束并且新人员显示在表格中.一切都很好看.

但是,如果我想添加另一个人,arrayController不会更新arrangeObjects属性(我发现不再调用arrayController的setContent:).

这是预期的行为吗?

macos core-data nstableview nsarraycontroller cocoa-bindings

1
推荐指数
1
解决办法
1315
查看次数