多个导航控制器中的视图控制器通信

Posted

技术标签:

【中文标题】多个导航控制器中的视图控制器通信【英文标题】:view controllers communication in multiple Navigation Controllers 【发布时间】:2010-08-17 20:42:41 【问题描述】:

我的应用正在使用一个带有两个标签栏项目的标签栏控制器:每个项目都是一个导航控制器。

我正在尝试从另一个导航控制器中的另一个视图控制器访问一个导航控制器中的一个视图控制器,这可能吗?怎么做??

如果能提供任何帮助,我将不胜感激,谢谢。

莫森

【问题讨论】:

【参考方案1】:

您可以考虑使用通知或(甚至更简单的)键值观察。

今天早上我给了一些人一些关于 UINavigationController 上下文中控制器间通信的建议。然后今天下午我第一次尝试了KVO,我不得不回去给出不同的建议。 KVO 比试图在视图层次结构中追踪事物要简单得多。您只需声明什么在观察什么,然后设置该东西以捕获更改通知。小菜一碟!

编辑:

实际上,通知可能是这里的方式——如果你在一个地方实例化了两个对象,你可以将一个对象注册为另一个键上的观察者,但如果你正在构建你的标签栏,情况就不一定如此从模板。

所以,通知。这个想法是,您将一个视图控制器注册为通知观察者,然后从另一个视图控制器触发通知,并在发送通知时通知观察者。这有点像您的应用程序向自己发送电子邮件。

注册和接收消息如下所示:

ViewControllerOne.m:

-(void)viewDidLoad  //a likely place, but not the only place you might do this

    ....
    // whatever else you're doing to initialize your VC, and then

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


-(void)iWasNotified:(NSNotification *)notification

    NSString *passedValue = (NSString *)notification.object;
    NSLog(@"We got notified and received: %@", passedValue);

然后发送消息就这么简单:

ViewControllerTwo.m:

[[NSNotificationCenter defaultCenter] 
  postNotificationName:@"myNotification"
                object:@"I'm passing you this NSString object!"];

您显然不仅限于在object: 字段中传递字符串。更可能的用途是传递self,然后您就可以访问通知发布视图控制器的任何公共字段。

这是它们的基本用法。您可以了解更多的微妙之处,所有这些都在这里列出: http://developer.apple.com/iphone/library/documentation/cocoa/Conceptual/Notifications/Introduction/introNotifications.html

【讨论】:

非常感谢您的回复,但是……对不起,我是一个非常新的iPhone SDK开发。如果您可以详细说明,什么是通知以及如何使用它。是否可以提供示例代码。我真的很感激。谢谢 非常感谢您的解释。它帮助我现在以更好的方式理解通知概念。虽然在我的应用案例中,我需要在驻留在不同导航控制器堆栈中的两个视图控制器之间共享实例变量数据和实例方法,所以我最终使用了一个单例类来实现两个视图控制器之间的相互通信。 那么在这种情况下,KVO 可能是更好的选择。您可以将特定视图控制器注册为数据单例的特定字段的观察者,并在该字段更改时调用特定方法。去看看苹果的文档吧,很简单。

以上是关于多个导航控制器中的视图控制器通信的主要内容,如果未能解决你的问题,请参考以下文章

如何将选项卡栏添加到默认视图并使用导航控制器与其他视图通信

iOS在导航堆栈中的视图控制器之间循环

如何将多个视图控制器推送到导航控制器上

使用多个导航控制器关闭多个模式视图

如何以编程方式添加多个导航控制器?

我们可以在 iOS 中创建多个导航控制器吗?