2012-03-13 152 views
4

我懷疑這是一個非常簡單的答案,或者我完全錯誤的軌道上。我需要能夠在App Delegate或其他視圖控制器中的視圖控制器中設置變量和訪問字段等。如何從應用程序委託和/或其他視圖控制器訪問多個視圖控制器?

以前我可以通過以下操作在 'didFinishLaunchingWithOptions' 從應用程序委託這樣做是爲了我的第一個視圖控制器:

的viewController =(視圖控制器*)self.window.rootViewController;

之後,我可以/可以通過執行正常的[viewController someMethod];來從App Delegate訪問視圖控制器中的方法。

如果我有多個視圖控制器(目前有3個),我怎麼可以從其他位置訪問其它的?順便提一下,我找到了一些解釋,但都談到了與代碼結合的nib/xibs。我沒有他們,我有一個故事板和代碼(我是新的應用程序開發)。

謝謝!

回答

5

在你的appDelegate你可以簡單地宣佈將舉行該viewControllers引用屬性。

例如:

在AppDelegate.h

在AppDelegate.m

@synthesize vc1,vc2; 

@property (nonatomic, strong) UIViewController *vc1; 
@property (nonatomic, strong) UIViewController *vc2; 

無論你正在創建這個viewControllers您可以訪問您appDelegate並設置它的屬性舉行正確的參考。不要忘記包含AppDelegate.h到這個文件。

UIViewController *someVC = [init view controller....]; 
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.vc1 = someVC; 

從那時起你可以訪問此的viewController作爲的appDelegate的財產。

編輯:爲故事板,它看起來像這將是安全的- (void)viewDidLoad做。

或者甚至更好的方法是(理查德提及)爲此在- (id)initWithCoder:(NSCoder *)decoder

「當從一個故事板實例化視圖控制器,iOS設備通過調用它的initWithCoder初始化新的視圖控制器:方法來代替。」從documentation

但請注意,如果你從一個視圖控制器更改任何數據到另一個你可能要考慮的代碼一個單獨的部分保存這些數據的(所以在model-view-controller方法稱爲model)。這將是在viewControllers之間「交換」數據的最安全的方式。

+0

感謝您的回答,我想我需要一個額外的資料片。我不以編程方式初始化我的視圖控制器,它是由故事板處理的......我如何初始化它們並將它們與SB連接起來? – 2012-03-13 20:13:23

+0

其實忘了,我和你在一起......現在在設置應用代理變量,然後將它從VC回來到App代表的價值。謝謝你會放棄它。 – 2012-03-13 20:15:44

+0

@RichardWilliams:好吧,如果遇到問題,只需'響起':) – 2012-03-13 20:17:12

相關問題