Заменить UIViewController в иерархии UINavigationController
У меня есть приложение для iPhone, которое использует стандартную реализацию UINavigationController
для навигации по приложениям.
Я пытаюсь выяснить способ замены контроллера представления в иерархии.
Другими словами, мое приложение загружается в rootViewController
, и когда пользователь нажимает кнопку, приложение нажимает на firstViewController
. Затем пользователь нажимает другую кнопку для навигации к приложению secondViewController
. Опять же, использование переходит к другому контроллеру представления, thirdViewController. Тем не менее, я хочу, чтобы BackButton thirdViewController
возвращался в firstViewController.
По существу, когда пользователь нажимает на thirdViewController
, я бы хотел, чтобы он заменил secondViewController
в иерархии навигации.
Возможно ли это? Я знаю, что он использует три20, но я не в этом случае. Тем не менее, если это возможно в Three20, то, безусловно, нужно использовать прямые вызовы SDK. У кого-нибудь есть мысли?
Cheers,
Бретт
Ответы
Ответ 1
Довольно просто, когда нужно нажать 3rdViewController вместо простого pushViewController
сделать это:
NSArray * viewControllers = [self.navigationController viewControllers];
NSArray * newViewControllers = [NSArray arrayWithObjects:[viewControllers objectAtIndex:0], [viewControllers objectAtIndex:1], thirdController,nil];
[self.navigationController setViewControllers:newViewControllers];
где [viewControllers objectAtIndex:0]
и [viewControllers objectAtIndex:1]
- ваш rootViewController и ваш FirstViewController.
Ответ 2
NSMutableArray *viewController = [NSMutableArray arrayWithArray:[navController viewControllers]];
[viewController replaceObjectAtIndex:1 withObject:replacementController];
[navController setViewControllers:viewController];
Дополнительную информацию см. в ссылка на класс UINavigationController.
Ответ 3
Невозможно оживить переход, если вы просто замените viewController
в массиве контроллера вида контроллеров навигации. Я бы рекомендовал сделать следующее в методе viewWillAppear
третьего контроллера представления.
-(void) viewWillAppear:(BOOL)animated
{
NSArray *vCs=[[self navigationController] viewControllers];
NSMutableArray *nvCs=nil;
//remove the view controller before the current view controller
nvCs=[[NSMutableArray alloc]initWithArray:vCs];
[nvCs removeObjectAtIndex:([nvCs count]-2)];
[[self navigationController] setViewControllers:nvCs];
[super viewWillAppear:animated];
}
Ответ 4
Более чистый способ в Swift должен быть:
extension UINavigationController {
func replaceTopViewController(with viewController: UIViewController, animated: Bool) {
var vcs = viewControllers
vcs[vcs.count - 1] = viewController
setViewControllers(vcs, animated: animated)
}
}
Ответ 5
Поскольку вы просто пытаетесь дважды вытащить из стека ViewControllers, возможно, вы получите тот же результат, позвонив
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
с задней кнопки thirdViewController
Ответ 6
- (void)swapTopViewController:(UIViewController *)topViewController{
NSArray *viewControllers = [self.navigationController viewControllers];
NSMutableArray *editableViewControllers = [NSMutableArray arrayWithArray:viewControllers];
[editableViewControllers removeLastObject];
[editableViewControllers addObject:topViewController];
[self.navigationController setViewControllers:editableViewControllers];
}
Ответ 7
Версия Swift 2.2:
if var viewControllers = navigationController?.viewControllers {
viewControllers[viewControllers.count - 1] = newViewController
navigationController?.viewControllers = viewControllers
}
Ответ 8
extension UINavigationController {
func setTop(viewController: UIViewController) {
viewControllers = [viewController]
}
}