2012-02-04 106 views
2

我有以下問題: 我創建了一個包含TabBar和三個ViewController的Storyboard的iOS 5 SDK應用程序。 從另一個類(Receiver.m)中,我想訪問例如ThirdViewController.m是TabBar的ViewController之一。iOS:從另一個類訪問故事板TabBar ViewController

在ThirdViewController.h我得到

@interface ThirdViewController : UIViewController { 
} 
@property (weak, nonatomic) IBOutlet UILabel *textlabel1; 
@end 

和ThirdViewController.h:

@implementation ThirdViewController 
@synthesize textlabel1; 
... 

這似乎是確定的,因爲我可以從ThirdViewController實例中設置的標籤屬性。 現在從內部Receiver.m可以訪問我用:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]]; 
    ThirdViewController *myVC = [storyboard instantiateViewControllerWithIdentifier:@"ThirdViewController"]; 
    myVC.textlabel1.text = @"Hello"; 

這是行不通的。我不想創建ThirdViewController的新實例,但訪問現有的實例只更新UILabel。 Project Navigator中的我的故事板默認名爲MainStoryboard.storyboard。 我在這裏得到ThirdViewController類的實例做錯了嗎?

錯誤說:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'Storyboard (<UIStoryboard: 0x190590>) doesn't contain a view controller with 
identifier 'ThirdViewController'' 

謝謝!

回答

2

故事板沒有給你一種訪問視圖控制器已經呈現的版本的方法 - 正如你發現的那樣,你正在使用的方法創建一個新的實例。

如果您期待外部對象更新屬於視圖控制器的特定標籤,我會懷疑代碼的結構。這不是典型的設計模式,因爲它使兩個對象之間緊密相關。通常,您將視圖控制器設置爲Receiver對象的委託(如果它是由該視圖控制器創建的),或者您的接收器對象會發送第三個視圖控制器正在偵聽的通知。

+0

好吧,這是我擔心的。那麼有沒有其他的方式(我發現像AppDelegate.window.ThirdViewController這不起作用),以某種方式獲得ThirdViewController實例通過ViewController'層次'?感謝您的建議,我知道這樣的事實,它不是好的風格,代碼會改變,但由於應用程序邏輯丟失,我試圖直接訪問ViewController。 – ZCDev 2012-02-04 09:30:01

+0

你必須得到標籤欄控制器(應用程序委託的根視圖控制器。窗口),然後從標籤欄控制器的viewcontrollers數組中獲取第三個視圖控制器。 – jrturton 2012-02-04 09:54:07

+0

'AppDelegate.window.UINavigationController.ThirdViewController'不會讓我那裏。有沒有人曾經這樣做,並願意分享一些代碼片段?我將不勝感激。否則,我將不得不改變一些代碼的結構。 – ZCDev 2012-02-05 18:08:41

3

我沒有關注此線程一段時間,但只是對那些有興趣的人如何工作我做了這個帖子,雖然我不會在我的代碼中使用這個(感謝上面的@jrturton評論)

// Bad style: 
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSArray *vcs = appDelegate.window.rootViewController.childViewControllers; 
YourFirstViewController *fvc = [vcs objectAtIndex:0]; 
YourSecondViewController *svc = [vcs objectAtIndex:1]; 

因此,我將標記jrturton的答案爲接受。

0

ZCDev's答案不適合我。這工作:

let tabBarViewController = UIApplication.shared.windows.first!.rootViewController as! UITabBarController 

更安全的選擇:

if let tabBarViewController = UIApplication.shared.windows.first?.rootViewController as? UITabBarController { 
    // access your tab bar controller here. 
} 

斯威夫特3,Xcode中8,iOS的10