我希望我的基于视图的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可能会返回已经被我缓存的视图,因此表内容会被错误的单元格搞乱.
这种方法的性能明显更好......
-
关于使滚动性能更高效的其他想法也很受欢迎.
我有一个配置了模式'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