47

ビューをナビゲーション スタックからポップして、別のビューを直接プッシュすることは可能ですか?

このセクションにフラットな階層を実装しようとしていて、セグメント化されたコントローラーが必要ですが、セグメント化されたコントローラーを好きなように見せることができないため、ナビゲーションコントローラーを使用しようとしています。

ボタンがクリックされると、次のコードを実行しました。

[[self navigationController] popViewControllerAnimated:YES];
        MapsViewController *aViewController = [[MapsViewController alloc]
                                               initWithNibName:@"MapsViewController" bundle:nil];
[self.navigationController pushViewController:aViewController animated:NO];
[aViewController release];

大丈夫ですが、押した形跡はありません。どんな助けでも大歓迎です。

4

7 に答える 7

46
 MapsViewController *aViewController = [[MapsViewController alloc]
                                        initWithNibName:@"MapsViewController" bundle:nil];
     // locally store the navigation controller since
     // self.navigationController will be nil once we are popped
 UINavigationController *navController = self.navigationController;

     // retain ourselves so that the controller will still exist once it's popped off
 [[self retain] autorelease];

     // Pop this controller and replace with another
 [navController popViewControllerAnimated:NO];//not to see pop

 [navController pushViewController:aViewController animated:YES];//to see push or u can change it to not to see.

または

 MapsViewController *aViewController = [[MapsViewController alloc]
                                        initWithNibName:@"MapsViewController" bundle:nil];


UINavigationController *navController = self.navigationController;

//Get all view controllers in navigation controller currently
NSMutableArray *controllers=[[NSMutableArray alloc] initWithArray:navController.viewControllers] ;

//Remove the last view controller
[controllers removeLastObject];

//set the new set of view controllers
[navController setViewControllers:controllers];

//Push a new view controller
[navController pushViewController:aViewController animated:YES];
于 2011-07-29T12:15:05.410 に答える
32

スウィフトの場合:

let newVc = UIViewController()
var vcArray = self.navigationController?.viewControllers
vcArray!.removeLast()
vcArray!.append(newVc)
self.navigationController?.setViewControllers(vcArray!, animated: false)

ストーリーボードに newVc が存在する場合:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let newVc = storyboard.instantiateViewControllerWithIdentifier("YourViewControllerIdentifier") as! UIViewController
var vcArray = self.navigationController?.viewControllers
vcArray!.removeLast()
vcArray!.append(newVc)
self.navigationController?.setViewControllers(vcArray!, animated: false)
于 2015-10-26T04:15:09.380 に答える
9

スウィフト 4 :

self.navigationController.setViewControllers[]..私にはうまくいきません。しかし、ナビゲーションコントローラーをインスタンス変数に保持し、プッシュ/ポップ操作を行うことで問題を解決できます。したがって、グリッチなしで静かにコントローラーを変更できます。

  guard let navigationVC = self.navigationController else { return }  
    navigationVC.popViewController(animated: false)
    navigationVC.pushViewController(myNewVC, animated: false)
于 2018-01-09T11:01:34.717 に答える
0

スイフト3.0

誰かがビュー階層に深く入りたい場合:

                //Go back to desired viewController and then push another viewController
                var viewControllers = self.navigationController!.viewControllers
                while !(viewControllers.last is MyViewControllerClass) {
                    viewControllers.removeLast()
                }
                // go to new viewController
                let anotherViewController = AnotherViewController(nibName: "AnotherViewController", bundle: nil)
                viewControllers.append(anotherViewController)
                self.navigationController?.setViewControllers(viewControllers, animated: true)
于 2017-07-13T12:12:29.017 に答える