Во-первых, ваш тест:
[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 = ...
}