Я искал и нашел несколько сообщений о том, как удалить представление из стека контроллера навигации. Я применил одну из методик, которые можно найти здесь: How can I remove a view from navigation controller. Однако, хотя представление удалено из стека, соответствующий UINavigationItem не удаляется из панели навигации, поэтому моя панель навигации не синхронизируется с данным видом.Как удалить элемент навигационной панели при удалении представления из контроллера навигации в iOS?
В частности, у меня есть последовательность видов под контролем контроллера навигации на моей раскадровке. Представление открытия позволяет пользователю выбирать одну из двух ветвей, чтобы следовать. Первая ветвь позволяет пользователю получать и отображать данные датчиков, поступающие из встроенной системы, к которой iPhone или iPad подключается через Wi-Fi. Другой путь позволяет пользователю войти в систему как администратор и отправить некоторые команды конфигурации во внешнюю встроенную систему.
Если пользователь выбирает маршрут администрирования, он будет следовать этой последовательности экранов: Главная-> Администратор Login-> Администрирование. После просмотра в Администрации пользователь может выполнить несколько задач. Что я хочу сделать, так это пропустить экран входа в систему администратора, когда они вернутся в Main, а затем перейти по другому пути (для просмотра данных датчика потока). По мнению администрации я извлекаю вид администратора Вход из стека, используя этот код
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableArray *navStack = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers];
NSMutableArray *navBarBrian = [[NSMutableArray alloc] initWithArray: [[[self navigationController] navigationBar] items] ];
UINavigationBar *navBar = [[UINavigationBar alloc] init];
navBar = self.navigationController.navigationBar;
NSLog(@"navStack = %@", navStack);
NSLog(@"navBar = %@", [[self navigationController] navigationBar]);
NSLog(@"navBarItems = %@", [[[self navigationController] navigationBar] items]);
NSLog(@"navBarBrian = %@", navBarBrian);
NSLog(@"navBarList = %@", navBar);
[navStack removeObjectAtIndex: [navStack count] - 2];
[navBarBrian removeObjectAtIndex:[navBarBrian count] - 1];
// self.navigationController.viewControllers = navStack;
[self.navigationController setViewControllers:navStack animated:NO];
// [navBar popNavigationItemAnimated:NO];
// [[[self navigationController] navigationBar] popNavigationItemAnimated:NO];
// [[[self navigationController] navigationBar] setItems:navBarBrian animated:NO];
NSLog(@"navStack = %@", navStack);
NSLog(@"navBar = %@", [[self navigationController] navigationBar]);
NSLog(@"navBarItems = %@", [[[self navigationController] navigationBar] items]);
NSLog(@"navBarBrian = %@", navBarBrian);
}
Так что, когда я вернуться обратно с точки зрения администрации, приложение делает идет к главному экрану просмотра. Однако заголовок в навигационной панели все еще говорит «Вход администратора» и имеет кнопку «Назад», указывающую на «Main». Я попробовал вытащить пункт навигации из самой панели навигации, но это вызывает исключение. Я могу захватить список элементов навигации, сохранить их в navBarBrian, а затем удалить элемент навигации для экрана входа администратора с моего собственного массива navBarBrian. Например, перед тем, как удалить объект в navBarBrian у меня есть:
2013-11-06 11: 59: 25,457 BikeComm [703: A0B] navBarItems = ( "UINavigationItem: 0xa8a4cd0", "UINavigationItem: 0xa8c4f40" )
2013-11-06 11: 59: 25,457 BikeComm [703: A0B] navBarBrian = ( "UINavigationItem: 0xa8a4cd0", "UINavigationItem: 0xa8c4f40" )
После того, удаление у меня
2013-11-06 11: 59: 25,458 BikeComm [703: A0B] navBarItems = ( "UINavigationItem: 0xa8a4cd0", "UINavigationItem: 0xa8c4f40" )
2013-11-06 11: 59: 25,459 BikeComm [703: A0B] navBarBrian = ( «UINavigationItem: 0xa8a4cd0» )
Однако я неспособен затем сохранить содержимое navBarBrian обратно в навигационной панели, используя метод setItems как это также бросает исключение: «Согласующий приложение из-за неотображенного исключения «NSInternalInconsistencyException», причина: «Невозможно вызвать setItems: анимировать: непосредственно на UINavigationBar, управляемом контроллером».
Так что же это за хитрость, чтобы удалить как представление, так и элемент навигации из соответствующих стеков?