我的应用正在使用带有两个标签栏项目的标签栏控制器:每个项目都是导航控制器。
我正试图从另一个导航控制器中的另一个视图控制器访问一个导航控制器中的一个视图控制器,这可能吗?以及如何?
我很感激任何可能的帮助,谢谢。
穆赫辛
答案 0 :(得分:3)
您可以考虑使用通知或(甚至更容易)键值观察。
我今天早上给了一些关于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