当 NSTableView 的数据源发生变化时,如何更新它?

Posted

技术标签:

【中文标题】当 NSTableView 的数据源发生变化时,如何更新它?【英文标题】:How do I update a NSTableView when its data source has changed? 【发布时间】:2009-11-18 19:41:23 【问题描述】:

我正在与 Cocoa Programming For Mac OS X 一起工作(一本很棒的书)。本书提供的练习之一是构建一个简单的待办事项程序。 UI 有一个表格视图、一个用于输入新项目的文本字段和一个用于将新项目添加到表格的“添加”按钮。

在后端,我有一个控制器,它是我的 NSTableView 的数据源和委托。控制器还实现了一个由“添加”按钮调用的 IBAction 方法。它包含一个 NSMutableArray 来保存待办事项列表项。单击按钮时,操作方法会正确触发并将新字符串添加到可变数组中。但是,我的数据源方法没有被正确调用。他们在这里:

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView NSLog(@"调用 numberOfRowsInTableView: %d", [todoList count]); 返回[待办事项列表计数];
- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(NSInteger)rowIndex 
    NSLog(@"Returning %@ to be displayed", [todoList objectAtIndex:rowIndex]);
    return [todoList objectAtIndex:rowIndex];

这就是问题所在。 -numberOfRowsInTableView 仅在应用程序首次启动时调用,而不是每次我向数组添加新内容时调用。 -objectValueForTableColumn 根本不会被调用。我认为这是因为 Cocoa 足够聪明,不会在没有可绘制的内容时调用此方法。是否需要调用某种方法让表格视图知道其数据源已更改,并且应该重绘自身?

【问题讨论】:

【参考方案1】:
-[NSTableView reloadData];

NSTableView API reference

【讨论】:

我确实花了一些力气去寻找,只是在错误的地方。我查看了 Table View Programming Guide、NSTableViewDataSource API 参考和 NSTableViewDelegate API 参考。当您知道它在哪里时,这似乎很明显。 不要让我开始尝试找到特定任务的方法,因为它可能分散在(你选择的神)只知道有多少类和协议。这是文档中的主要弱点。要实际使用不熟悉的类,您必须阅读该类的文档、它继承自的所有类以及它继承或使用的所有协议。古怪的乐趣。 @TechZen 够公平的。主题指南和 API 文档之间似乎存在脱节,主题指南并不总能引导您找到正确的 API 文档。 当数据源很大时,这会不会效率低下或导致性能低下? “reloadData”会重新加载整个表,但通常我们在更新数据源中的一项或向数据源插入新项目时调用此方法。

以上是关于当 NSTableView 的数据源发生变化时,如何更新它?的主要内容,如果未能解决你的问题,请参考以下文章

基于视图的 NSTableView 中的自定义背景

当实体发生变化时,OpenJPA 对 db 模式做了啥?

当实际数据发生变化时,结果缓存数据会发生啥变化?

当关系发生变化时,是不是有更新 NSManagedObject 的好方法?

当 vuex 商店的值发生变化时,如何更新组件中的状态?

当变量发生变化时,Apollo 客户端缓存不会在查询中更新