2

我想开发一个应用程序,其中主窗口有NSTabView几个NSTabViewItems,并且在每个项目中都有不同的NSTableView.

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

我已经阅读了很多关于使用委托等在控制器之间传递数据的内容,但我认为必须有另一种更清晰的方法来解决这个问题。

有下一个示例场景:

TabOneController.h

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

TabTwoController.h

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

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

提前致谢

4

3 回答 3

2

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

如果您希望控制器相互调用,则有许多具有不同含义的可能性并且没有确定的答案,一切都取决于情况。重要的问题是:为什么所有选项卡控制器都想访问其他选项卡控制器?通常,您应该保持控制器隔离。这称为松散耦合,它对您的设计非常有利。

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

无论你做什么,都不要使用单例:) 我在 GitHub 上放了一些示例代码,展示了如何在不(错误)使用单例的情况下连接项目。

于 2012-05-26T12:18:16.737 回答
1

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

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 是它在标签栏控制器维护的数组中的位置。

于 2012-05-14T13:57:26.137 回答
0

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

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

于 2012-05-26T11:55:57.667 回答