как изменить rootviewcontroller для NavigationController?

17

У меня есть navigationController, который представлен как modalview и чей rootviewcontroller говорит FirstViewController. В какой-то момент я хочу изменить rootviewcontroller navigationController на SecondViewController. Что я сделал, это

[self.navigationController initWithRootViewController:SecondViewController];

Я не уверен, что я сделал правильно и был ли выпущен FirstViewController? Кто-нибудь знает, как правильно это сделать?

Спасибо заранее!

    
задан Nuzhat Zari 19.04.2012 в 11:39
источник

5 ответов

40

Сделайте либо

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

или

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

где firstViewController - это экземпляр FirstViewController , а secondViewController - это экземпляр классов SecondViewController соответственно. Последний вариант является ярлыком для setViewControllers:animated: без анимации.

    
ответ дан Costique 19.04.2012 в 11:58
источник
1
- (void) changeRootViewControllerOFNavigationControlllerAtRuntime:(UIViewController *) viewController {

     UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:viewController];
     [UIApplication sharedApplication].delegate.window.rootViewController=navController; 
}     
    
ответ дан Abhilash Khunte 20.01.2016 в 10:16
источник
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. а затем нажмите его над контроллером fakerootview

Попторотоконтроллер должен быть перезаписан, чтобы убедиться, что он всегда всплывает в индекс 1 стека, а не индекс 0.

Получатель контроля над просмотром должен быть изменен, чтобы он возвращал массив без fakerootviewcontroller ( removeobjectatindex: 0 )

Надеюсь, это поможет!

    
ответ дан Jacco 19.04.2012 в 12:06
источник
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];
    
ответ дан user1072975 02.10.2013 в 10:08
источник
0

Swift 3

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

    }
    
ответ дан Vyacheslav 10.02.2017 в 12:31
источник