2011-12-16 16 views
1

まず、この質問には前向きに質問されていますが、この場合はNavigation Controllerが既に設計されている逆の方法を求めています。 TableGet、およびIBで作成された順にAvail:それは言われていると...NavigationController Back Skip View

私はUINavigationController 3との見解を持っています。

今後とき、私はAvailTableからGetに行きたいが、私はAvailの「戻る」ボタンを押したとき、私はGetをスキップし、直接バックTableに行きたいです。これは可能ですか?もしそうなら、どうですか?

答えて

9

は、ここで私はそれをやった方法は次のとおりです。

NSArray *VCs = [self.navigationController viewControllers]; 
[self.navigationController popToViewController:[VCs objectAtIndex:([VCs count] - 2)] animated:YES]; 

あなたはUINavigationControllerをサブクラス化する必要があるとしているナビゲーションコントローラの戻るボタンを無効にすることができるようにするに。 http://www.hanspinckaers.com/custom-action-on-back-button-uinavigationcontroller

+0

、突然何者か(あるいはあなた)あなたのプロジェクトを更新し、ナビゲーションコントローラのスタックに新しいVCを削除したり、追加します。そしてあなたのコードはうまくいきません(最良の場合)。マジックナンバーは常に悪です。 – slxl

2

あなたが求めているのとまったく同じUINavigationController's-popToViewController:animated:-popToRootViewControllerAnimated:をご覧ください。つまり、ナビゲーションスタックを特定のビューコントローラまたはルートビューコントローラにポップします。しかし、あなたはまだそれらを使用するために、ナビゲーションコントローラのバックボタンアクションをインターセプトする必要があります。

3

は、ナビゲーションコントローラのデリゲートメソッドを実装します:どのようにこのチュートリアルでチェックしてください

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 

これは、ナビゲーションコントローラのスタック内のすべてのVCのために発生します。

は何がやりたいことは、あなたがそれで削除したいビューコントローラなしで全体のナビゲーションコントローラのスタックを置き換えるです(すぐにナビゲーションコントローラの後にVCでこのコードを入れて、.hに> < UINavigationControllerDelegate置きます)。変更不可能な配列なので、VCを削除する前に変更可能な配列に変換し、VCを削除してから、ナビゲーションコントローラのスタックを呼び出す[self.navigationController setViewControllers:newVCs animated:NO];に置き換える必要があります。それは重要な部分です。あなたはページを読み込んだ後にスタックを置き換えていますが、あなたが使っているVCを保持しているので、それはまだスタックの一番上のアイテムなので、ユーザーには目に見える影響はありません。スタックにたくさんのVCがない限り、それは高価な呼び出しではありません。

は、ここで私は、デリゲートメソッドでそれをやった方法は次のとおりです。

//Remove list setup page if new list was created 
if ([self.navigationController topViewController].class == [ItemViewController class]) 
{ 
    NSArray *VCs = [self.navigationController viewControllers]; 

    if(((UITableViewController*)[VCs objectAtIndex:[VCs count]-2]).class == [NewCardTypeController class]) 
    { 
     NewCardTypeController *removedObject = [VCs objectAtIndex:[VCs count]-2]; 
     if(removedObject != nil) 
     { 
      NSMutableArray *newArray = [NSMutableArray arrayWithArray:VCs]; 
      [newArray removeObject:removedObject]; 
      NSArray *newVCs = [NSArray arrayWithArray:newArray]; 
      [self.navigationController setViewControllers:newVCs animated:NO]; 
     } 
    } 
} 
+0

ところで、他の答えではできないことは、正しいナビゲーションバーのシーケンスを保持し、オーバーライドしていないため、戻るボタンが遷移時に正しいアニメーション動作をするようにすることです。 – Christine