管理控制器之间数据的最佳对象架构

时间:2012-05-13 19:48:24

标签: objective-c xcode cocoa

我想开发一个应用程序,其中主窗口的NSTabView包含多个NSTabViewItems,并且在每个项目中它将具有不同的NSTableView

如何组织类架构以便能够从每个选项卡tableview控制器访问其他?最好的方法是什么?

我已经阅读了很多关于passing data between controllers using delegates的内容等等,但我认为必须有另一种更清晰的方法来解决这个问题。

有下一个示例场景:

TabOneController.h

@interface TabOneController : NSControl {
    NSMutableArray *listOne;
        ...
}

TabTwoController.h

@interface TabTwoController : NSControl {
    NSMutableArray *listTwo;
        ...
}

这两个控制器使用NSTableView列表实现NSMutableArray dataSource和委托方法。我想要一个适当的场景,两个控制器可以互相访问(类方法,视图控制器,另一个控制器管理所有或任何好主意适合这里)。您认为这是最好的方式吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

如果要在控制器之间共享数据,一个好的解决方案是将所有控制器传递给数据对象的同一个实例。如果要共享更多数据或者数据附加了一些额外功能,请将其包装在模型类中,让控制器共享指向同一模型的指针。

如果你想让控制器互相调用,有很多可能会有不同的含义,而且没有明确的答案,一切都取决于具体情况。重要的问题是:为什么所有标签控制器都想要访问其他标签控制器?通常你应该保持控制器隔离。这被称为松耦合,它非常适合您的设计。

如果控制器需要相互呼叫,请尝试重新考虑设计。也许一些行为应该转到模型而不是?例如,您可以将删除代码移动到模型中,而不是调用另一个控制器从列表中删除项目,而其他感兴趣的控制器可以通过观察模型来了解模型更改。

无论你做什么,just don’t use singletons :)我已经放了一些sample code on GitHub来展示如何在没有(错误)使用单身人士的情况下连接项目。

答案 1 :(得分:1)

第一个选项: 为每个指向其他控制器的控制器声明实例变量?例如,假设您在anotherController中创建了一个属性CustomController1,并且:

CustomController1 *controller1 = [[CustomController1 alloc] init];
CustomController2 *controller2 = [[CustomController2 alloc] init];
controller1.anotherController = controller2;

这样,controller1就可以访问controller2。然后就像其他控制器做类似的事情。你甚至可以在那里应用一些继承。

第二种选择: 从特定的控制器做:

CustomController *customController =
(CustomController *)[self.tabBarController.viewControllers objectAtIndex:x]

假设CustomController是您要访问的控制器的类,x是它位于由选项卡栏控制器维护的阵列中的位置。

答案 2 :(得分:0)

我会创建一个单例类来存储数据并处理所有数据操作...... 您可以将数据存储在NSUserDefaults中作为最简单的做法。

如果您只使用一些共享变量,我只会使用AppDelegate。