NSArrayController/NSTreeController和Cocoa视图

3
我已经阅读了一些Objective C和Cocoa的内容,虽然我对Objective-C的整体简单性感到非常兴奋,但是在Cocoa和特别是MVC设计模式方面,我感到完全迷失了。我读过的Cocoa书籍只要求读者完成一组程序步骤,没有对API机制进行太多的解释。我正在尝试理解NSTableView、NSOutlineView及其数据源、代理和这些与各种控制器类(如NSArrayController和NSTreeController)有什么关系的整体含义。所以我有几个问题要问:
  • 这些类是如何相互操作的?
  • NSTableView的数据源是否是NSArrayController的实例?
  • 在NSTableView或NSOutlineView中,委托和数据源应该是同一个类吗?
  • 除了绑定之外,NSArrayController和NSTreeController还有其他重要优点吗?

假设有一个包含某种数据(C结构)的容器(在C中)。我们想要能够在NSTableView(或NSOutlineView)中显示这些数据,并在运行时交换视图,如果数据结构是分层的。我应该创建一个具有NSArrayController(或NSTreeController)实例的类,并包装C容器的功能吗?

谢谢你,原谅我的愚蠢问题。

我不打算尝试回答,因为我自己对Cocoa/Objective-C相对较新(来自iPhone方面)。然而,我认为你列出的一些问题更多是与Objective-C相关而不是Cocoa相关。我认为,一旦你尝试了几个程序,特别是学习了其他人完成的一些程序,它将逐渐“点击”。我把Cocoa看作是Objective-C中有用技巧的库,并且是操作系统功能的包装器。但首先你必须学习并熟悉Objective-C。 - frankodwyer
2
不,它们与Objective-C实际上没有任何关系,Objective-C是一种编程语言。类之间的MVC关系是Cocoa框架的一部分,提供了这些类。iPhone上的Cocoa Touch也是如此。 - Peter Hosey
3个回答

3
这些问题并不愚蠢。你正在准确地提出正确的问题,并且已经深入了解如何学习Cocoa。首先学习MVC以及Cocoa如何实现它,其他内容就会变得清晰明了。
虽然已经有些过时,但学习Cocoa没有比Aaron Hillegass的Cocoa Programming for Mac OS X更好的书籍了。如果您感兴趣,我在去年写了一些关于这本书的评论。还有一些指南(主要针对新的iPhone开发人员)在这里这里
对于您的具体问题,不要将数据存储在C结构中,而是将其存储在Objective-C对象中(模型对象,“M”在MVC中)。
首先,需要创建一个控制器类作为NSOutlineView的数据源(该视图用于分层数据)。暂时避免使用以“Controller”结尾的Cocoa类。这些类与绑定相关(主要用于Core Data),虽然非常强大,但在开始时不建议深入了解(即使经过多年的Cocoa编程,我也只在特定的问题上使用绑定;如果它们很复杂,它们可能会让你的程序难以维护)。现在你的控制器应该是NSObject的子类。它将实现NSOutlineViewDataSource方法。如果你需要一个代理,将同一对象作为数据源和代理是常见且自然的。

1
这些类如何真正地互操作?
考虑使用TableView或OutlineView的传统方式(任何语言都可以)。通常,您会实现一个数据源接口来为视图提供数据。这个数据源实现本质上是一个“控制器”,它将您的数据模型转换为表视图;它还可以处理行选择、插入、删除、排序、过滤等等。
现在假设您的应用程序有许多不同的TableViews,每个TableViews都有自己的数据源实现。您会发现每个数据源实现开始看起来都一样;因为假设它们正在处理相同或类似的数据模型,排序等代码也是相同的,所以您可以重复使用许多数据源之间的代码。
这就是NSArrayController的作用:一个通用的TableView控制器/数据源。它处理行选择、插入、删除、排序、过滤等等,从而使您免于编写大量样板代码。
NSTableView的数据源是否是NSArrayController的实例?
不是,数据绑定取代了传统的数据源接口;因此,NSTableView使用数据绑定连接到数组控制器。
例如,您可以将表视图列绑定到模型的属性:
myArrayController.arrangedObjects.firstName 

其中arrangedObjects是NSArrayController的一个属性,而firstName是您的模型的一个属性。

NSTableView或NSOutlineView中的委托和数据源应该是同一个类吗?

使用数据绑定时,不需要设置NSTableView的数据源。您仍然可以提供NSTableView委托以自定义视图的外观和行为。NSArrayController不是NSTableView的委托。

如果不使用数据绑定,则必须实现数据源。通常,数据源和委托是同一个对象。


0

Delegate 是一个对象,当视图发生有趣的事情时,它会接收回调。

Datasource 与 delegate 非常相似 - 它也接收回调,但仅与为表格获取数据相关的回调。

它们不必相同(您可能有可以操作任何数据源的控制器/委托),但在实践中,它们通常是相同的对象,因为在同一类中提供数据并对其进行操作很方便。

如果这不适合您的程序,则根本不需要使用 NSArrayController。任何类都可以成为委托(它是非正式协议,这意味着您不需要声明任何接口或继承任何基类),您只需编写自己的委托方法即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接