我已经阅读了一段时间的目标C和Cocoa,我不得不说,虽然我对Objective的总体简单性感到兴奋,但我对Cocoa,尤其是MVC设计模式感到非常困惑。我读过的Cocoa书籍要求读者完成程序工作的一系列步骤,而不需要对API的机制做太多解释。我试图理解NSTableView、NSOutlineView、它们的数据源、委托的总体含义,以及所有这些与各种控制器类(如NSArrayController和NSTreeController )之间的关系。所以我有几个问题要问:
让我们假设有一个容器(在C中)具有某种类型的数据(一个C结构)。如果数据结构是分层的,我们希望能够在NSTableView (或NSOutlineView)中显示这些数据,并在运行时交换视图。我是否应该创建一个以NSArrayController (或NSTreeController)作为实例的类,并包装C容器的功能?
谢谢,原谅我的愚蠢问题。
发布于 2009-08-25 15:02:21
这些都不是愚蠢的问题。你问的正是正确的问题,并且已经深入到了如何学习可可的核心。首先学习MVC,以及Cocoa是如何实现它的,其余的都会很清楚。
虽然渐渐过时了,但仍然没有比艾伦·希勒加斯的Mac OS X的可可编程更适合学习可可的书了。如果你感兴趣的话,我还写了一些关于这本书去年的评论。还有一些指南(主要针对新的iPhone开发人员)、这里和这里。
针对您的具体问题,不要将数据存储在C结构中,而是将其存储在object对象(模型对象,MVC中的"M“)中。
然后构建一个Controller类作为NSOutlineView的数据源(它是为分层数据设计的)。目前,不要使用以“Controller”结尾的Cocoa类。它们与绑定相关(主要用于核心数据)。虽然非常强大,但它们比您开始时想要深入研究的内容更多(即使经过多年的Cocoa编程,我也只对某些目标问题使用绑定;如果程序很复杂,它们会使您的程序很难维护)。您的控制器现在应该是NSObject的子类。它将实现NSOutlineViewDataSource方法。如果您需要委托,那么将相同的对象设置为数据源和委托是很常见和自然的。
发布于 2009-08-25 17:30:40
这些类是如何真正互操作的?
考虑使用TableView或OutlineView (在任何语言中)的传统方法。您通常实现一个数据源接口,该接口将为视图提供数据。这个数据源实现本质上是一个“控制器”,它将数据模型转换为表视图;它还可以处理行选择、插入、删除、排序、筛选等。
现在假设您的应用程序有许多不同的TableViews,每个应用程序都有自己的数据源实现。您会发现每个数据源实现的外观都是相同的;您可以在数据源之间重用大量代码,因为假设它们处理相同或类似的数据模型,用于排序等的代码也是相同的。
这就是NSArrayController的本质:一个通用的TableView控制器/数据源。它处理行选择、插入、删除、排序、筛选等,从而避免了编写一堆样板代码。
NSTableView的数据源是NSArrayController的实例吗?
不,数据绑定取代了传统的数据源接口;因此,NSTableView使用数据绑定连接到数组控制器。
例如,可以将表视图列绑定到模型的属性:
myArrayController.arrangedObjects.firstName 其中arrangedObjects是NSArrayController的属性,firstName是模型的属性。
委托和数据源应该是NSTableView或NSOutlineView中的同一个类吗?
使用数据绑定时,不设置NSTableView的数据源。您仍然可以提供一个NSTableView委托来自定义视图的外观和行为。NSArrayController不是NSTableView委托。
当不使用数据绑定时,必须实现数据源。数据源和委托通常是同一个对象。
发布于 2009-08-25 14:45:03
委托是在视图发生有趣事件时接收回调的对象。
Datasource非常类似于委托--它还接收回调,但只接收那些与获取表数据相关的回调。
它们不一定是相同的(可以对任何数据源进行操作的控制器/委托),但在实践中它们通常是相同的对象,因为在同一个类中提供数据和对其进行操作非常方便。
如果不适合您的程序,则根本不需要使用NSArrayController。任何类都可以是委托(它是非正式协议,意味着您不需要声明任何接口或继承任何基类),您可以简单地编写自己的委托方法。
https://stackoverflow.com/questions/1328325
复制相似问题