21

モーダルビューとして表示され、rootviewcontrollerがFirstViewControllerであるnavigationControllerがあります。ある時点で、navigationControllerのrootviewcontrollerをSecondViewControllerに変更したいと思います。

[self.navigationController initWithRootViewController:SecondViewController];

私が行ったことが正しいかどうか、FirstViewControllerがリリースされたかどうかはわかりませんが、これを行う正しい方法を誰か知ってください。

前もって感謝します!

4

5 に答える 5

46

どちらかを行う

[firstViewController.navigationController setViewControllers: [NSArray arrayWithObject: secondViewController] 
                                                    animated: YES];

また

firstViewController.navigationController.viewControllers = [NSArray arrayWithObject: secondViewController];

ここfirstViewControllerで、はクラスのインスタンスでFirstViewControllerあり、secondViewControllerはクラスのインスタンスですSecondViewController。後者のバリアントは、setViewControllers:animated:アニメーションなしのショートカットです。

于 2012-04-19T09:58:02.013 に答える
1
- (void) changeRootViewControllerOFNavigationControlllerAtRuntime:(UIViewController *) viewController {

     UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:viewController];
     [UIApplication sharedApplication].delegate.window.rootViewController=navController; 
}     
于 2016-01-20T09:16:10.543 に答える
0

これは正しい方法ではありません。initすでに初期化されているオブジェクトを呼び出すことはめったにありません(私は決してそうは思いません)。

この問題を解決する方法は、UINavigationControllerのサブクラスを作成することです。

このサブクラスでは、私はinitwithrootviewcontroller:

- (id) initWithRootViewController:(UIViewController *)rootViewController
{
    UIViewController *fakeController = [[[UIViewController alloc] init] autorelease];

    self = [super initWithRootViewController:fakeController];
    if(self)
    {
        self.fakeRootViewController = fakeController;
        rootViewController.navigationItem.hidesBackButton = YES;

        [self pushViewController:rootViewController animated:NO];
    }
    return self;
}

fakeRootViewControllerは実際には何もしません。これは、iOSがrootviewcontrollerを設定する可能性がない場合の回避策です。

別の関数(setRootViewController:aViewController)では、新しい「rootviewcontroller」のバックボタンを非表示にして、ユーザーが偽のrootviewcontrollerがあることを決して認識しないようにします。次に、それをfakerootviewcontrollerの上にプッシュします

poptorootviewcontrollerは、常にスタックのインデックス0ではなくインデックス1にポップするように上書きする必要があります。

viewcontrollersのゲッターは、fakerootviewcontroller(removeobjectatindex: 0)なしで配列を返すように変更する必要があります

お役に立てれば!

于 2012-04-19T10:06:43.943 に答える
0

カスタムUINavigationControllerを作成する必要があります

@interface mySwitchRootViewNavigationController()

@property (nonatomic, retain) myFirstViewController * FirstViewController;
@property (nonatomic, retain) mySecondViewController * SecondViewController;

@end

- (void)viewDidLoad
{
  [super viewDidLoad];
  self.FirstViewController = [[myFirstViewController alloc] init];
  self.SecondViewController = [[mySecondViewController alloc] init];
}

-(void) setRootViewControllerWithID:(int) viewControllerID
{
  if (viewControllerID == 1) {
    self.viewControllers = [NSArray arrayWithObject:self.SecondViewController];
  } else
  {
    self.viewControllers = [NSArray arrayWithObject:self.FirstViewController];
  }
}

-(void)viewWillAppear:(BOOL)animated
{
  [self setRootViewControllerWithID:intVar];
  [super viewWillAppear:animated];
}

初期化

mySwitchRootViewNavigationController * switchView = [mySwitchRootViewNavigationController alloc] init];
于 2013-10-02T08:08:43.437 に答える
0

スウィフト3

fileprivate func changeRootVC() {
        if let newVC  = self.storyboard?.instantiateViewController(withIdentifier: "MyStoryboardID"), let nc = self.navigationController {
            nc.setViewControllers([newVC], animated: true)
        }

    }
于 2017-02-10T11:31:26.463 に答える