2009-08-05 50 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

相關問題