1

ストーリーボードを使用して、iOS 5 タブ付きアプリケーションがあります。

私の Tabbar Controller は 3 つの Navigation Controller を指しています。

そのうちの 1 つから、フローは次のようになります。

開始ビュー --> 写真ビュー (モーダル) --> カタログ ビュー

写真の画面には、次のコードのボタンがあります。

- (IBAction)acceptPhotoButtonPressed:(id)sender {
    UIViewController *catalogView = [self.storyboard instantiateViewControllerWithIdentifier:@"CatalogView"];
    [self.navigationController pushViewController:catalogView animated:YES];
}

私は , をいじってみましたpresentingViewController-parentViewControllerそれらを a にキャストしたタイプでさえUINavigationController。これによりクラッシュし、次のエラー メッセージが表示されます。

2012-04-06 00:32:45.808 myapp[19345:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITabBarController pushViewController:animated:]: unrecognized selector sent to instance 0x18d0d0'

つまり、私は を手に入れたのではなく、 を手に入れたことがわかりUINavigationControllerますUITabBarController

これを回避する方法はありますか?

4

2 に答える 2

4

「プッシュ」スタイルのセグエは、によって管理されているView Controllerからのみ実行できますUINavigationController。そうしようとしても、そうでなければ何も起こりません。

質問で説明したように Photo ビューをモーダルに表示する代わりに、 UINavigationController のインスタンスをモーダル ビューとして表示し、Photo View をナビゲーション ビューのルート ビュー コントローラーにする必要があります。(これはすべてストーリーボードで設定できます)。その後、プッシュセグエが機能します。

トップ ナビゲーション バーを最初のビュー コントローラー (写真ビュー) に表示したくない場合は、次を使用できます。

[self.navigationController setNavigationBarHidden:YES animated:NO]

これにより、上部のナビゲーション バーが非表示になります。新しいビュー コントローラーをプッシュしたら、そのビュー コントローラーと後続のビュー コントローラーでナビゲーション バーを再表示するには、新しいビュー コントローラーで setNavigationBarHidden を NO に設定する必要があります。

[self.navigationController setNavigationBarHidden:NO animated:NO]
于 2012-04-06T19:10:23.100 に答える
-1

セグエは、あるシーンから別のシーンに移行するための好ましい方法です。

そのボタンまたは VC 自体からセグエを作成し、そのセグエをプッシュしたいシーンに接続することができます。Segue プロパティが Push に設定されていることを確認してから、ボタンの IBAction (VC に接続していると仮定) で次の操作を行います。

- (IBAction)acceptPhotoButtonPressed:(id)sender {
    [self performSegueWithIdentifier@"mySegueID" sender:nil];
}

次に、prepareForSegue メソッドで:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString@"mySegueID"]) {
        //  Do whatever setup you need to do before firing the segue
    }
}

Segue をボタン自体に接続すると、performSegue メソッドを完全に削除できます (IBAction は実際には必要ありません)。

于 2012-04-05T22:42:38.063 に答える