web-dev-qa-db-ja.com

NavigationControllerのrootviewcontrollerを変更する方法?

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

[self.navigationController initWithRootViewController:SecondViewController];

私がやったことが正しいかどうか、FirstViewControllerがリリースされたかどうかはわかりませんか?

前もって感謝します!

20
Nuzhat Zari

どちらかを行う

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

または

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

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

42
Costique
- (void) changeRootViewControllerOFNavigationControlllerAtRuntime:(UIViewController *) viewController {

     UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:viewController];
     [UIApplication sharedApplication].delegate.window.rootViewController=navController; 
}     
1
Abhilash Khunte

Swift

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

    }
0
Vyacheslav

カスタム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];
0
user1072975

これは正しい方法ではありません。すでに初期化されたオブジェクトで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にポップするように上書きする必要があります。

ビューコントローラのゲッターを変更して、fakerootviewcontroller(removeobjectatindex: 0

お役に立てれば!

0
Jacco