web-dev-qa-db-ja.com

プログラムでストーリーボードを使用してView Controllerをプッシュする別の方法

プログラムでストーリーボードにインスタンス化されたView Controllerをプッシュする別の方法を探しています。実際には、次のビューに移動するために使用する方法と、前のビューに戻る方法の2つを見つけました。

  1. pushViewControllerを使用:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; 
    LocationWebView *lvc = [storyboard instantiateViewControllerWithIdentifier:@"LocationWebView"];
    [self.navigationController pushViewController:lvc animated:YES];
    
  2. Segueをプログラムで実行する:

    [self performSegueWithIdentifier: @"SongSegue" sender: self];
    

代替案と、この操作を実行する最良の方法に関するヒントはありますか?モーダルビューを参照していないことに注意してください。

57
yassassin

AppleはperformSegueWithIdentifier:sender:someObjectプログラムでセグエを実行します。この方法で行うことには、少なくともいくつかの利点があります。

  • 独自のコードが少ないは、フレームワークにより多くの作業を行わせることを意味します。 Appleがプッシュセグエの超クールな新しい視覚効果を思いついたり、パフォーマンスを改善したり、将来のiOSリリースのバグを修正した場合、アプリは無料で入手できます。フレームワークがあなたのためにしているかもしれない仕事をするためにあなたが書くコードのバグを書くあなたのチャンスを増やします。

  • IBの詳細は、簡単に変更できることを意味します。すべてのプッシュセグエをモーダルセグエ、または独自の超クールな視覚効果を行うカスタムセグエタイプに変更する場合は、IBで「すべて」を選択し、ハンティングの代わりにワンクリックでセグエタイプを変更できますあなたのコードの周り。


また、最初の方法を使用する場合でも、2番目の方法を使用する場合でも、View Controllerを押して前のView Controllerに「戻る」ことは、ユーザーの期待どおりには機能しません。 SongViewControllerをプッシュすると、ナビゲーションスタックの最後に追加されます。

LocationViewController -> SongViewController

LocationViewControllerをもう一度押して「戻る」場合:

LocationViewController -> SongViewController -> LocationViewController

ユーザーがナビゲーションバーの戻るボタンをタップすると、ロケーションビューからソングビュー、ロケーションビューに再び戻ります。 (また、これを続けると、「戻る」と「進む」たびにView Controllerのチェーンが増え続け、他のトラブルにつながる可能性があります。

代わりに、Navigation Controllerに戻ることを処理させる必要があります。その目的のためにナビゲーションバーにボタンを配置し、ほとんどのユースケースを処理します。戻るために独自のコントロールを作成する必要がある場合、iOS 5ではIBでこれを行うことはできませんが、Navigation ControllerのpopViewControllerAnimated: 方法。

36
rickster

個人的には、UINavigationControllerの下にあるUIViewControllerにいるときに#2を使用します。 UINavigationControllerがない場合は動作しないと思います。

UITabBarControllerの下にあるビューを使用している場合、次のコードを使用して別のタブに移行します。

NSUInteger tabIndex = 2; // Index of the tab I want to select
UIViewController * viewCtrl = [_tabController.viewControllers objectAtIndex:tabIndex];
_tabController.selectedViewController = viewCtrl;
4
gfrigon