2010-08-17 273 views
1

我的應用程序使用帶有兩個標籤欄項目的標籤欄控制器:每個項目都是導航控制器。多個導航控制器中的視圖控制器通信

我想從另一個導航控制器中的另一個視圖控制器訪問一個導航控制器中的一個視圖控制器,這可能嗎?如何??

我很感激任何可能的幫助,謝謝。

Mohsen

回答

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

+0

非常感謝您的回覆,但是...... 我很抱歉,我很新的iPhone SDK開發。 如果您可以請詳細說明,什麼是通知以及如何使用它。有沒有可能提供一個示例代碼。我真的很感激它。 謝謝 – mshaaban 2010-08-17 21:01:14

+0

非常感謝您的解釋。它幫助我以更好的方式瞭解通知概念。 儘管在我的應用案例中,我需要在駐留在不同導航控制器堆棧中的兩個視圖控制器之間共享實例變量數據和實例方法,因此我最終使用了一個單例類來在兩個視圖控制器之間進行內部通信。 – mshaaban 2010-08-19 20:52:38

+0

那麼在這種情況下,KVO可能是更好的選擇。您可以將特定的視圖控制器註冊爲數據單例的特定字段中的觀察者,並且在該字段發生更改時調用特定的方法。去看看蘋果的文檔,這是非常簡單的。 – 2010-08-20 11:49:27

相關問題