我有一个带有根视图控制器,主视图控制器和辅助视图控制器的应用程序。我希望能够从辅助视图控制器向主视图控制器发送消息。如何获得对主数据库的引用,以便我可以向其发送消息?有没有更好的方法来构建这个?
答案 0 :(得分:7)
简短的回答:您可以像这样回复您的申请代表:
YourAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
您可能已经在应用程序委托类中指向了根视图控制器。您可能有指向根控制器对象中的主视图控制器和辅助视图控制器的指针。所以,你可以写这样的代码:
SecondaryViewController *primary = delegate.rootController.primaryController;
然后,您可以根据自己的内容向其发送消息。不需要出口;只是每个视图控制器的属性。
有许多较长的答案,还有一个关于为什么这种做法可能有问题的讨论,因为它引入了对象之间可能不需要的联系。在“纯粹的”面向对象设计中,您将遵循干净的设计模式,在各个方向上的对象之间具有清晰的链接,从而可以更好地重用代码。
另一种选择是将指针传递给类在初始化时需要的对象。为视图控制器类实现一个新的initWithSomethingOrOther,并将对象作为参数传递。缓存您需要的这些指针(不要忘记保留它们)以供以后使用。
答案 1 :(得分:4)
干净的方法是为辅助控制器的委托定义协议,列出主控制器需要提供的方法:
@protocol SecondaryControllerDelegate <NSObject>
- (void)secondaryController:(SecondaryController*)secondaryController
frobFooWithBar:(Bar*)myBar;
- (BOOL)secondaryController:(SecondaryController*)secondaryController
shouldTwiddleBaz:(Baz*)currentBaz;
@end
现在将一个委托属性添加到SecondaryController:
@interface SecondaryController : UIViewController {
id <SecondaryControllerDelegate> delegate;
...
}
// delegates are one of the few places you don't retain an object
@property (assign) id <SecondaryControllerDelegate> delegate;
...
在SecondaryController的实现部分中,合成委托属性。 (不在析构函数中释放它。)当SecondaryController需要与PrimaryController通信时,它应该在委托上调用适当的方法。
现在让您的PrimaryController实现SecondaryControllerDelegate协议:
@interface PrimaryController : UIViewController <SecondaryControllerDelegate> {
...
在PrimaryController中实现委托方法。
最后,让您的PrimaryController将自己设置为SecondaryController的委托。具体如何执行此操作取决于您是否在nib中创建SecondaryController。如果你这样做,那就建立连接;如果没有,请在分配并初始化SecondaryController之后立即进行。
你为什么要做这首歌和舞蹈?好吧,当你必须在主要和辅助节点之间引入另一个控制器,或者在应用程序的其他地方使用辅助节点,或者甚至在另一个应用程序中使用辅助节点时(我有一个控制器在三个中使用)我的四个应用程序),您根本不需要更改SecondaryController;你只需更改现在应该成为其委托的任何类。从长远来看,这是一个令人难以置信的节省时间。
答案 2 :(得分:0)
如果控制器是从NIB加载的,您可以在辅助控制器上定义一个插座,并将其连接到接口构建器中的主控制器。
答案 3 :(得分:0)
使用NSNotificationCenter进行对象之间的分离通信。