0

我想實現一個應用程序,它有五個標籤。每個選項卡對應一個視圖控制器,如viewController1〜viewController5。如何訪問在分配給UINavigationController的viewController中聲明的屬性?

對於viewController4,我在AppDelegate.m添加navigationController它如下:

viewController4 = [[iPhone_ASRAViewController alloc] initWithNibName:@"iPhone_ASRAViewController_iPhone" bundle:nil]; 
navController1 = [[UINavigationController alloc]initWithRootViewController:viewController4]; 

在iPhone_ASRViewController類,我宣佈在.h文件中的屬性如下:

@property (nonatomic, retain) NSString *student_id; 

然後,我想訪問在FirstViewController中iPhone_ASRViewController中聲明的student_id(設置student_id),並在FirstViewController.m中實現如下代碼:

iPhone_ASRAViewController *iphone_ASRAVC= [self.tabBarController.viewControllers objectAtIndex:3]; 
iphone_ASRAVC.student_id=[stu_class stringByAppendingString:stu_id]; 
//stu_class and stu_id is the text field declared in the FirstViewController. 

理想情況下,當用戶推送FirstViewController類中實現的某個按鈕時,student_id的值也將設置爲iPhone_ASRAViewController類。

不幸的是,當用戶按下按鈕的應用程序會崩潰。錯誤消息如下:

[UINavigationController setStudent_id:]: unrecognized selector sent to instance 0x9341170 

有人可以提供一些想法/解決方案來調試,請?

+0

我不知道從哪裏開始。你在哪裏實現了setter?,爲什麼要讀寫? – Radu

回答

0

那麼,在WENN標籤欄視圖控制器具有(或更好的是)導航控制器,則viewControllers陣列標籤欄控制器的包含導航控制器代替。其實,你(或你的故事板)把它們放進去了! 它可能是視圖控制器和導航控制器的混合,取決於創建或重新配置(如果有)標籤欄時實際設置的內容。

所以我sugest給定的指標從viewContollers接收對象爲ID類型的東西。然後檢查它是否是導航控制器(使用isKindOfClass:[iPhone_ASRAViewController class]),如果是,則直接使用它。如果不是,那麼檢查它是否是UINavigationConroller類(或者其他方式 - 對你來說更方便),如果是,則獲取其topViewController屬性並從那裏開始。

編輯:已在迴應評論:

id someController = [self.tabBarController.viewControllers objectAtIndex:3]; 
if (someController isKindOfClass:[UINavigationController class]) { 
    someController = [someController topViewController]; //re-using someController 
} 
// someController should be a UIViewController from here onwards. But you may double check if you want. 
if (someController isKindOfClass:[iPhone_ASRAViewController class]) { 
    iPhone_ASRAViewController *myIPhone_ASRAViewController (iPhone_ASRAViewController*) someController; 
    // you may now savely access those properties that are unique to your custom view controller class 
} 
+0

感謝您的建議。因爲我是objc的初學者,所以我沒有明確指出「從viewContollers接收對象」。你能更詳細地描述它嗎?我非常感謝你的幫助。 在另一方面,我發現,當我在FirstViewController聲明iPhone_ASRAViewController的新實例訪問stu_id。這個方法似乎與我在AppDelegate.m中聲明的navController1衝突。 – Tek

+0

我打算訪問UITabBarController的'viewControllers'屬性並獲得第三個(在你的例子中)元素。你這樣做了。所有我建議的是首先將它存儲在一個'id'類型的varualbe中,然後檢查它是一個導航控制器還是一個視圖控制器(分別是'UIViewController'的子類)。你的情況可能是它總是一個導航控制器。但檢查這是一個更一般的,因此較少出錯和可重用的方法。 –

+0

我會在答案中添加一些示例代碼。 –

相關問題