it-swarm.com.ru

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

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

[self.navigationController initWithRootViewController:SecondViewController];

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

Заранее спасибо!

17
Nuzhat Zari

Сделать либо

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

или же

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

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

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

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

Swift 3

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. а затем нажмите его над контроллером fakerootview

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

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

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

0
Jacco