#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;
}
}];