2012-09-22 30 views
2

在IOS中,我非常願意在使用prepareforsegue傳遞數據和委託傳回數據之間直接隔離的視圖之間傳遞數據。使用代理將數據通過多個視圖控制器傳回

我遇到的問題是,我構建了一個應用程序,它貫穿4個視圖,然後當用戶點擊進入第四個視圖時,我彈出其餘視圖返回到第一個視圖控制器,這是觀點,但我無法弄清楚如何將數據委託給第一個。

我相信問題在於在第一個視圖控制器中設置委託。我不能像我通常用segue.destinationviewcontroller那樣設置它,因爲那個視圖控制器還不存在。我應該把它放在別的地方嗎?什麼是正確的方法來做到這一點?

回答

4

在這種情況下,請考慮使用NSNotificationCenter在視圖控制器之間進行通信,而不是使用委託來傳遞數據。

在你的第一個視圖控制器,您將註冊偵聽通知:

- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(handleFourthViewSubmit:)   
               name:@"fourthViewSubmit" 
               object:nil]; 
} 

,並創建方法時,通知發送到運行:

- (void)handleFourthViewSubmit:(NSNotification *)notification { 
    NSDictionary *theData = [notification userInfo]; // theData is the data from your fourth view controller 

    // pop views and process theData 

} 

在你的第一個視圖控制器dealloc方法,確保作爲觀察員取消註冊(以避免潛在的崩潰):

-(void) dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 

然後在第四視圖控制器,廣播通知的輸入按鈕被按下時:

// note: dataDict should be an NSDictionary containing the data you want to send back to your first view controller 
[[NSNotificationCenter defaultCenter] postNotificationName:@"fourthViewSubmit" 
                object:self 
                userInfo:dataDict]; 
+0

這完美地工作,謝謝!我只有一個問題 - 我正在使用自動引用計數。我只用過ARC,並不太熟悉這些差異。我需要擔心dealloc方法,還是這是自動的?還有什麼我應該做的地方呢?再次感謝! –

+0

如果您使用的是ARC,只需刪除對[[super dealloc]'的調用。編譯器會自動爲你添加它。 – jonkroll

相關問題