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

Заменить UIViewController в иерархии UINavigationController

У меня есть приложение для iPhone, которое использует стандартную реализацию UINavigationController для навигации по приложениям.

Я пытаюсь выяснить способ замены контроллера представления в иерархии. Другими словами, мое приложение загружается в rootViewController, и когда пользователь нажимает кнопку, приложение нажимает на firstViewController. Затем пользователь нажимает другую кнопку для навигации к приложению secondViewController. Опять же, использование переходит к другому контроллеру представления, thirdViewController. Тем не менее, я хочу, чтобы BackButton thirdViewController возвращался в firstViewController.

По существу, когда пользователь нажимает на thirdViewController, я бы хотел, чтобы он заменил secondViewController в иерархии навигации.

Возможно ли это? Я знаю, что он использует три20, но я не в этом случае. Тем не менее, если это возможно в Three20, то, безусловно, нужно использовать прямые вызовы SDK. У кого-нибудь есть мысли?

Cheers, Бретт

4b9b3361

Ответ 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]
    }

}