【问题标题】:How do I update a NSTableView when its data source has changed?当 NSTableView 的数据源发生变化时,如何更新它?
【发布时间】: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 足够聪明,不会在没有可绘制的内容时调用此方法。是否需要调用某种方法让表格视图知道其数据源已更改,并且应该重绘自身?

【问题讨论】:

    标签: cocoa macos nstableview


    【解决方案1】:
    -[NSTableView reloadData];
    

    NSTableView API reference

    【讨论】:

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