从子UIViewController到父UIViewController的通信

时间:2009-08-11 02:14:16

标签: iphone cocoa-touch model-view-controller uiviewcontroller

我还没想到:我有一个mainViewController可以切换两个视图,viewControllerA和ViewControllerB。我切换视图的方法是在mainViewController中使用UIButton(mainButton),然后单击它切换viewControllerA< - > ViewControllerB。

现在这是我的问题。我的ViewControllerA有一个UIButton(ButtonA)。我希望通过点击它,它告诉mainViewController切换到另一个视图(viewControllerB)

换句话说,子视图(viewControllerA)应该向mainViewController(它的父视图)发送一条消息,它想要触发属于主视图的方法,而不是它自己(viewA)。

我怎么能实现这一目标?

2 个答案:

答案 0 :(得分:15)

与父对象的通信时,您可以选择一些设计模式。授权和通知都是不错的选择。

这里的重要思想是松散耦合的沟通。通知使用Singleton来处理通信,而委托使用对父对象的弱引用。 (查看Cocoa With Love:retain cycles

如果你使用委托,你可以为你的ViewControllerA创建一个非正式的协议,MainViewController必须遵守该协议。

您可以将其称为ViewControllerADelegate协议:

    @protocol ViewControllerADelegate

    @optional
    - (void)bringSubViewControllerToFront:(UIViewController*)aController;

    @end

或者ViewControllerA可以发布通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MyFunkyViewSwitcherooNotification" object:self];

如果MainViewController想要知道,那么它应该是持久的:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(swapThoseViews:) name:@"MyFunkyViewSwitcherooNotification" object:nil];

答案 1 :(得分:0)

有几种方法可以实现这一目标: 看看这里的协议http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProtocols.html,还看一下在一些苹果示例项目中使用的RootViewController,这里的Metronome http://developer.apple.com/iphone/library/samplecode/Metronome/正在使用它来从主视图切换到首选项视图。在View COntroller编程指南http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/PresentingModelViewControllers/PresentingModelViewControllers.html中查看模态视图控制器及其交互,您还可以在此处查看答案Switch between 3 or more views