Лучший способ выбрать контроллер просмотра с помощью popToViewController: анимированный:

#objective-c #cocoa-touch

#objective-c #cocoa-touch

Вопрос:

Рассмотрим:

 [self.navigationController popToViewController:[[self.navigationController viewControllers]objectAtIndex:1] animated:YES];
  

Есть ли лучший способ получить индекс контроллера просмотра для всплывающего окна? Таким образом, если я что-то сделаю со стеком навигации, мне не придется возвращаться и редактировать это. Я думал о том, чтобы, возможно, сохранить его в ivar на VC или использовать макросы #define. Есть идеи?

Редактировать: В стеке есть четыре контроллера просмотра. Я использовал этот код, чтобы перейти с четвертого на второй.

Комментарии:

1. Что определяет «контроллер просмотра для всплывающего окна»?

2. Он использует индекс вместо явной передачи ссылки на контроллер просмотра. Это круто, но было бы неплохо не кодировать индекс жестко.

Ответ №1:

 YourViewController *yourViewController;
for ( UIViewController *viewController in self.navigationController.viewControllers ) {
    if ( [viewController isMemberOfClass:[YourViewController class]] ) {
        yourViewController = (YourViewController*)viewController;
        break;
    }
}

[self popToViewController:yourViewController animated:YES];
  

Конечно, это предполагает, что в стеке будет только один экземпляр класса контроллера, который вы ищете. Если их больше, я думаю, вы можете сохранить их в глобально доступном месте, таком как делегат приложения.


Примечание — обычно, если вы используете это в UIViewController, последняя строка кода будет:

 [self.navigationController popToViewController:seuleMainPage animated:YES];
  

Комментарии:

1. Фантастически умная идея — хорошая. Я решил просто сохранить его в виде синглтона (например, делегата приложения, как вы говорите), но это такое отличное решение. Спасибо!

Ответ №2:

Вы можете заменить код в вопросе простой категорией на UINavigationController , которую можно использовать везде, где это уместно.

 @interface UINavigationController(indexPoping)
- (void)popToViewControllerAtIndex:(NSInteger)newVCsIndex animated:(BOOL)animated;
@end

@implementation UINavigationController(indexPoping)
- (void)popToViewControllerAtIndex:(NSInteger)newVCsIndex animated:(BOOL)useAnimation
{
    if (newVCsIndex < [self.viewControllers count]) {
        [self popToViewController:[self.viewControllers objectAtIndex:newVCsIndex] animated:useAnimation];
    }
}


// Usage

...

NSInteger indexToPopTo = ...
[self.navigationController popToViewControllerAtIndex:indexToPopTo animated:YES]

...
  

Комментарии:

1. Я получаю необъявленный идентификатор для newVCsIndex

Ответ №3:

Просто используя с isKindOfClass

 [self.navigationController.viewControllers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if([obj isKindOfClass:[YourViewController class]]) {
            YourViewController *objVC = obj;
            [self.navigationController popToViewController:objVC animated:YES];
            *stop = YES;
        }
    }];