2012-06-27 78 views
4

我是新的Objective-C所以對於一個愚蠢的問題表示歉意。UIViewControllers之間的通信

我從我的主視圖控制器打開「選項」視圖控制器。兩者都是在故事板中構建的。在呈現選項控制器之前和之後,我需要停止並在主視圖控制器上啓動定時器。在選項控制器關閉後(一個按鈕調用關閉),我需要將一些信息發回我的主控制器,或者至少讓我的主控制器知道它需要刷新一些值。

主要問題 什麼是呈現一個視圖控制器和前開放後,在執行一些主持人的方法的最佳方式?

我試過了什麼 我發現了一些方法來做到這一點,但它們都很麻煩,我認爲必須有一些合理的方法來做到這一點。

  1. 理想情況下,我想用我的兩個控制器之間的故事板設立SEGUE。
  2. 我設法通過訪問故事板並調用instantiateViewControllerWithIdentifier以編程方式調用選項控制器。它的工作,但看起來有點複雜。
  3. 我沒能找到對的UIViewController委託方法來處理解僱事件
  4. 當我試圖通過presentingViewController訪問選項控制器,主控制器和向下轉換它,我通過包含有一個鏈接錯誤我.h文件兩次(不知道使用#define的Obj-C標準是什麼)。

感謝您的幫助......

+0

你可能想弄清楚你的主要問題,簡潔地陳述了,併發布一些相關的代碼 – Dustin

+0

確定,主要的問題是,什麼是呈現一個視圖控制器和前開放後,在執行一些主持人的方法的最佳途徑。 – vladz

+0

看看這個http://stackoverflow.com/q/11229830/1439815 – Dustin

回答

0

感謝您的回覆。

我結束了

  1. 調用prepareForSegue執行轉變前碼

  2. 釋放呈現視圖控制器當presentingViewController調用performSelector。

,我確信其他建議,將工作太。

1

對於ViewControllers之間的通信被鏈接弱,你可以使用NSNotificationCenter:

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html

在這裏,您可以發送消息給所有ViewControllers聽,它需要處理一些更改(例如更改字體大小的選項)。

實現起來非常簡單,並且它可以保持某些ViewController對彼此的依賴性降低。

+0

據我所知,這是一個很強的鏈接。主控制器執行預打開方法,打開新控制器(模態),執行後關閉方法。 – vladz

1

我已經遇到了幾乎每個應用程序,我在市場上。不同的是,我從來沒有決定走下故事板路徑。

我一直能夠做到這一點的方式是在控制器之間提供訪問器功能。通過將交叉定義的控制器定義爲選項視圖標題中的UIViewController類型,然後將主視圖控制器的標題僅包含在.m文件中,即可解決鏈接器問題。現在,當您從選項視圖中調用主視圖控制器例程時,您必須將其轉換爲主視圖控制器的類型!

您還必須在選項視圖中提供一個例程,該例程允許您設置將自己的主視圖控制器指針保持爲自變量的變量。

實例爲您optionsView

@interface optionsViewController : UIViewController{ 
    UIViewController * myReactiveMainViewController; 
} 

-(void)setMyReactiveMainViewController:(UIViewController *)controller; 

沒有在爲optionsView

#import "myMainViewController.h" 

-(void)setMyReactiveMainViewController:(UIViewController *)controller{ 
    myReactiveMainViewController = controller; 
} 

.m文件在任何其他呼叫返回到主視圖控制器,你將不得不這樣做:

-(void)returnToMain{ 
    [(myMainViewController *)myReactiveMainViewController someCall:variable]; 
} 

當然,這例子假定你myMainViewController實現的方法卡萊d「someCall」作爲輸入參數。

2

所有這一切都可以很容易地用故事板和NSNotificationCenter,和NSCoding來完成。在你的主控制器的viewDidLoad方法,把這個代碼:當你想從選項控制器,主控制器更新

(void)receiveNotification:(NSNotification*)notification 
{ 
    //... 
} 

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

然後創建在同一個控制器此方法:

[[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self]; 

此外,我會建議使用NSArchiving基本數據持久性。剛剛發現這個教程,看起來不錯。 http://samsoff.es/posts/archiving-objective-c-objects-with-nscoding

基本上,創建一個對象,可以存儲信息,使用nscoding對其進行編碼,然後在需要時對其進行解碼。它對我很好。

希望有幫助!

2

主要問題是什麼呈現視圖控制器和前開放後,在執行一些主持人的方法的最佳方式?

爲防萬一上面的回答比你想要的要複雜一些,我建議在開始之前執行演示者方法的最簡單方法是在演示者的prepareForSegue方法中執行此操作。如果您需要將數據發送到目的地視圖控制器,你可以訪問它的屬性是這樣的:

ViewController *destinationVC = [segue destinationViewController]; 

一個簡單的方法來執行演示的方法後,開放將是:

ViewControllerSubclass *previousVC = [self presentingViewController]; 

然後用該類或實例來執行您的類或實例方法。你可以在目的地的viewWillAppear中做到這一點。

對不起,如果你已經知道這一切;通常很難預測需要什麼樣的複雜程度。