Как проверить, есть ли в контроллере uinavigation контроллер стека - PullRequest
4 голосов
/ 20 января 2010

У меня есть UINavigationController. Я должен вытолкнуть представление из UINavigationController и заменить его другим представлением. Как мы можем найти объект UIViewController и заменить его другим?

когда я печатаю

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:           myDelegate.navigationController.viewControllers];

Я пытался ..

[allViewControllers removeObjectIdenticalTo: @"NonLogginedViewController"];         
[allViewControllers removeObjectIdenticalTo: myDelegate.nonLogginedViewController];
myDelegate.navigationController.viewControllers = allViewControllers;

Но он не обновил стек UINavigationController. Я не знаю, как использовать removeObjectIdenticalTo со стеком UINavigationController ..

Пожалуйста, помогите мне ..

1 Ответ

26 голосов
/ 20 января 2010


Во-первых, ваш тест:

[allViewControllers removeObjectIdenticalTo: @ "NonLogginedViewController"];

... проверяет строку, а не контроллер представления. Так что это не сработает.

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

NSMutableArray *allControllers = [self.navigationController.viewControllers mutableCopy];
[allControllers removeObjectAtIndex:allControllers.count - 2];
[self.navigationController setViewControllers:allControllers animated:NO];

Но я думаю, что в вашем случае вы хотите найти определенный контроллер и удалить его. Один из способов сделать это - найти определенный класс, например, LoginController. Настройте новый массив, скопировав старый, а затем выполните итерацию по этому новому массиву:

NSArray *allControllersCopy = [allControllers copy];

for (id object in allControllersCopy) {
   if ([object isKindOfClass:[LoginController class]])
      [allControllers removeObject:object];
}


... затем установите массив allControllers для свойства viewControllers, как и раньше.

ПРИМЕЧАНИЕ. Если вы управляете стеком UINavigationController из содержащего контроллера представления - возможно, после появления этого контроллера представления - вам следует подождать, пока представление полностью не отобразится на экране. Хорошее место для этого - переопределение viewDidAppear:, например:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated]; 
    NSMutableArray *allControllers = ...
}
...