我想开发一个应用程序,其中主窗口的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和委托方法。我想要一个适当的场景,两个控制器可以互相访问(类方法,视图控制器,另一个控制器管理所有或任何好主意适合这里)。您认为这是最好的方式吗?
提前致谢
答案 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。