Подтвердить что ты не робот

Как изменить rootviewcontroller NavigationController?

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

[self.navigationController initWithRootViewController:SecondViewController];

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

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

4b9b3361

Ответ 1

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

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

или

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

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

Ответ 2

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

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

Ответ 3

Это неправильный способ, вызывающий 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.

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

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

Ответ 4

Вам нужно сделать пользовательский 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];

Ответ 5

Swift 3

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

    }