NavigationController Назад Пропустить Просмотр - PullRequest
1 голос
/ 16 декабря 2011

Во-первых, я знаю, что этот вопрос задают в прямом направлении, но в этом случае я прошу обратного способа, в котором навигационный контроллер уже разработан. С этим, как говорится ...

У меня есть UINavigationController с тремя представлениями: Table, Get и Avail в том порядке, который был создан в IB.

Когда я иду вперед, я хочу перейти от Table к Get до Avail, но когда я нажимаю кнопку "Назад" на Avail, я хочу пропустить Get и сразу вернуться к Table. Это возможно? Если да, то как?

Ответы [ 3 ]

10 голосов
/ 17 декабря 2011

Вот как я это сделал:

NSArray *VCs = [self.navigationController viewControllers];
[self.navigationController popToViewController:[VCs objectAtIndex:([VCs count] - 2)] animated:YES];

Чтобы иметь возможность переопределить кнопку возврата навигационных контроллеров, вам нужно создать подкласс UINavigationController. Посмотрите, как в этом уроке: http://www.hanspinckaers.com/custom-action-on-back-button-uinavigationcontroller

3 голосов
/ 01 декабря 2012

Реализация метода делегирования контроллера навигации:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated

Он сработает для всех VC в стеке контроллеров навигации. (поместите этот код в VC сразу после вашего контроллера навигации и вставьте <<code>UINavigationControllerDelegate> в .h)

Что вы хотите сделать, это заменить весь стек контроллера навигации без контроллера представления, который вы хотите удалить в нем. Так как это неизменяемый массив, вы должны преобразовать его в изменяемый массив перед удалением VC, удалить VC, а затем заменить стек контроллера навигации вызовом [self.navigationController setViewControllers:newVCs animated:NO];. Это важная часть. Вы заменяете стек после того, как загрузили страницу, на которой находитесь, но, поскольку вы сохраняете виртуальный канал, на котором вы находитесь, он по-прежнему является верхним элементом в стеке, поэтому не оказывает видимого влияния на пользователя. Пока у вас не много VC в стеке, это не дорогой звонок.

Вот как я это сделал в методе делегата:

//Remove list setup page if new list was created
if ([self.navigationController topViewController].class == [ItemViewController class])
{
    NSArray *VCs = [self.navigationController viewControllers];

    if(((UITableViewController*)[VCs objectAtIndex:[VCs count]-2]).class == [NewCardTypeController class])
    {
        NewCardTypeController *removedObject = [VCs objectAtIndex:[VCs count]-2];
        if(removedObject != nil)
        {
            NSMutableArray *newArray = [NSMutableArray arrayWithArray:VCs];
            [newArray removeObject:removedObject];
            NSArray *newVCs = [NSArray arrayWithArray:newArray];
            [self.navigationController setViewControllers:newVCs animated:NO];
        }
    }
}
2 голосов
/ 17 декабря 2011

Взгляните на UINavigationController's -popToViewController:animated: и -popToRootViewControllerAnimated:, которые делают именно то, что вы просите. То есть они возвращают стек навигации обратно в конкретный контроллер представления или в корневой контроллер представления. Вам все равно нужно будет перехватить действие кнопки назад навигационного контроллера, чтобы использовать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...