Как изменить rootviewcontroller NavigationController?
У меня есть navigationController, который представлен как modalview и чей rootviewcontroller говорит FirstViewController. В какой-то момент я хочу изменить rootviewcontroller navigationController на SecondViewController. Что я сделал, это
[self.navigationController initWithRootViewController:SecondViewController];
Я не уверен, что я сделал правильно и был ли выпущен FirstViewController? Кто-нибудь знает, как правильно это сделать?
Спасибо заранее!
Ответы
Ответ 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)
}
}