0

全部で 5 つのタブを持つアプリケーションを実装しようとしています。各タブはviewController1~viewController5などのView Controllerに対応しています。

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;

次に、iPhone_ASRViewController で宣言されている Student_id にアクセスし (student_id を設定)、FirstViewController で次のように 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 

誰かがデバッグするためのアイデア/解決策を教えてくれませんか?

4

1 に答える 1

0

さて、タブ バーのビュー コントローラーにナビゲーション コントローラーがある (またはより良い) 場合viewControllers、タブ バー コントローラーの配列には代わりにナビゲーション コントローラーが含まれます。実際、あなた (またはあなたの絵コンテ) がそれらを入れました! タブ バーの作成時または再構成時 (存在する場合) に実際に設定された内容に応じて、View Controller と Navigation Controller が混在している可能性があります。

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
}
于 2013-06-05T11:47:29.057 に答える