如何在不使用-reloadData的情况下更新NSTableView?

Oma*_*ayr 15 macos xcode cocoa objective-c nstableview

我是Mac的新手.我试图更新NSTableView中的特定单元格而不使用-reloadData,作为-reloadData更新整个表.我尝试了一切,但一切都是徒劳的.我正在尝试做类似于我们以前在MFC或.NET中的CListCtrl中所做的事情.

Vla*_*mir 29

看看reloadDataForRowIndexes:columnIndexes:方法.要更新单个单元格,以下内容应该有效:

[yourTable reloadDataForRowIndexes:[NSIndexSet indexSetWithIndex:row]  
                     columnIndexes:[NSIndexSet indexSetWithIndex:column]];
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是正确的解决方案,但应该提到 reloadData() 也只是重新渲染当前可见的单元格而不是整个表格。 (2认同)

Chr*_*son 19

这是视图通常在Cocoa中工作的方式与它们在其他框架中的工作方式之间的根本区别.-reloadDataForRowIndexes:columnIndexes:正如Vladimir指出的那样,NSTableView确实公开了一个API,但你会注意到没有"withObject:"参数.

这是因为Cocoa视图和控件不能用作数据容器.相反,它们用于呈现和与由其他模型对象管理的数据交互,通常通过某种类型的中间控制器.

例如,给定一个表格视图,如果您的模型已通知您的控制器某些特定数据已更改,则控制器可以使映射到该值的表格的显示部分无效 - 如果甚至表格的显示部分.下一次绘制自己时,表将询问其数据源(控制器),以便为需要重绘的区域显示值.

因此,尽管用户交互存在表面上的相似性,但您可能希望重新考虑如何编写代码来实现用户界面.最后,您将了解更多因素模型 - 视图 - 控制器样式代码; 价格是你需要比在不需要这种分离关注的框架中更彻底地代表你的模型.