2009-08-05 64 views
0

所以我有一个UINavigationController,显然,它包含我所有的ViewControllers。访问导航堆栈上的其他视图

我有三个。

根 - > View2-> VIEW3。

所以我想知道的是以下可能...

当我“在” VIEW3(及根系与视图2的实例都坐在导航堆栈上)有可能是我打电话给任何View2或根视图的方法/发送消息?

如果是这样,一个人如何去这件事吗?如果需要,我会发布一些示例代码。

感谢,

乔恩

回答

4

假设你在视图控制器之一是,你可以做这样的事情:

UIView* view2 = [self.navigationController.viewControllers objectAtIndex:1]; 
UIView* rootView = [self.navigationController.viewControllers objectAtIndex:0]; 

现在你可以给他们你想要的任何消息。

2

NSNotification的工作非常好,你希望有松散耦合的对象。在Cocoa/iPhone上下文中,这意味着它们之间没有任何引用,主要是。

在控制器,其可以接收所述消息:

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

在需要发送消息的控制器:

NSDictionary *dict = [NSDictionary dictionaryWithObject: <some object> forKey: @"key"]; 
[[NSNotificationCenter defaultCenter] postNotificationName: @"MessageBetweenControllers" object: self userInfo: dict]; 

上面的例子仅仅是一个模板(例如,NSDictionary的位是可选的),但它显示了机制。阅读有关NSNotification和NSNotificationCenter的文档以获取详细信息。

这不是纯粹的理论。这是我用于我的三个已发布应用程序和新的应用程序之间的对象间通信的主要方法。通知的开销很小。

两个陷阱:确保你永远只一次的addObserver每封邮件 - 在NSNotificationCenter不剔除重复;如果您插入两次相同的观察者,它将收到两次消息。此外,请确保你做removeObserver在你的dealloc方法(同样,见文档。)

+0

另外不要忘记,消息分派他们在同一个线程接收和调度线程将阻塞,直到收到的方法消息返回。 – 2009-08-05 14:55:30

+0

好点。我通常使用通知来设置标志以及诸如强制tableView reloadData之类的操作,这些操作会很快返回,但是您一定要小心在接收方的通知中做了什么。 – Amagrammer 2009-08-05 15:14:36

+0

是的,这实际上让我有一次,我没有想到它;) – 2009-08-05 15:26:05