首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSArrayController/NSTreeController和Cocoa视图

NSArrayController/NSTreeController和Cocoa视图
EN

Stack Overflow用户
提问于 2009-08-25 13:37:03
回答 3查看 1.1K关注 0票数 3

我已经阅读了一段时间的目标C和Cocoa,我不得不说,虽然我对Objective的总体简单性感到兴奋,但我对Cocoa,尤其是MVC设计模式感到非常困惑。我读过的Cocoa书籍要求读者完成程序工作的一系列步骤,而不需要对API的机制做太多解释。我试图理解NSTableView、NSOutlineView、它们的数据源、委托的总体含义,以及所有这些与各种控制器类(如NSArrayController和NSTreeController )之间的关系。所以我有几个问题要问:

  • 这些类是如何真正互操作的?
  • NSTableView的数据源是NSArrayController的实例吗?
  • 委托和数据源应该是NSTableView或NSOutlineView中的同一个类吗?
  • 撇开绑定不说,NSArrayController和NSTreeController还有其他重要优势吗?

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

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

EN

回答 3

Stack Overflow用户

发布于 2009-08-25 15:02:21

这些都不是愚蠢的问题。你问的正是正确的问题,并且已经深入到了如何学习可可的核心。首先学习MVC,以及Cocoa是如何实现它的,其余的都会很清楚。

虽然渐渐过时了,但仍然没有比艾伦·希勒加斯的Mac OS X的可可编程更适合学习可可的书了。如果你感兴趣的话,我还写了一些关于这本书去年的评论。还有一些指南(主要针对新的iPhone开发人员)、这里这里

针对您的具体问题,不要将数据存储在C结构中,而是将其存储在object对象(模型对象,MVC中的"M“)中。

然后构建一个Controller类作为NSOutlineView的数据源(它是为分层数据设计的)。目前,不要使用以“Controller”结尾的Cocoa类。它们与绑定相关(主要用于核心数据)。虽然非常强大,但它们比您开始时想要深入研究的内容更多(即使经过多年的Cocoa编程,我也只对某些目标问题使用绑定;如果程序很复杂,它们会使您的程序很难维护)。您的控制器现在应该是NSObject的子类。它将实现NSOutlineViewDataSource方法。如果您需要委托,那么将相同的对象设置为数据源和委托是很常见和自然的。

票数 3
EN

Stack Overflow用户

发布于 2009-08-25 17:30:40

这些类是如何真正互操作的?

考虑使用TableView或OutlineView (在任何语言中)的传统方法。您通常实现一个数据源接口,该接口将为视图提供数据。这个数据源实现本质上是一个“控制器”,它将数据模型转换为表视图;它还可以处理行选择、插入、删除、排序、筛选等。

现在假设您的应用程序有许多不同的TableViews,每个应用程序都有自己的数据源实现。您会发现每个数据源实现的外观都是相同的;您可以在数据源之间重用大量代码,因为假设它们处理相同或类似的数据模型,用于排序等的代码也是相同的。

这就是NSArrayController的本质:一个通用的TableView控制器/数据源。它处理行选择、插入、删除、排序、筛选等,从而避免了编写一堆样板代码。

NSTableView的数据源是NSArrayController的实例吗?

不,数据绑定取代了传统的数据源接口;因此,NSTableView使用数据绑定连接到数组控制器。

例如,可以将表视图列绑定到模型的属性:

代码语言:javascript
复制
myArrayController.arrangedObjects.firstName 

其中arrangedObjects是NSArrayController的属性,firstName是模型的属性。

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2009-08-25 14:45:03

委托是在视图发生有趣事件时接收回调的对象。

Datasource非常类似于委托--它还接收回调,但只接收那些与获取表数据相关的回调。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1328325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档