0

Я искал и нашел несколько сообщений о том, как удалить представление из стека контроллера навигации. Я применил одну из методик, которые можно найти здесь: 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, управляемом контроллером».

Так что же это за хитрость, чтобы удалить как представление, так и элемент навигации из соответствующих стеков?

ответ

0

Вид смущения, что вы пытаетесь сделать здесь ... но то, что ваше занятие кажется очень неудобным.Обычно, когда вы сталкиваетесь с такими проблемами, что-то не соответствует вашему пользовательскому интерфейсу.

Экран входа в систему обычно представляет собой вид Модаля, а не часть навигационного контроллера. То, что вы делаете, вам никогда не придется делать.

Возможно, войдите в систему с главного экрана и создайте делегата для экрана входа в систему с помощью основного прослушивания. После входа в систему, позвоните делегату &, отклоните модальный. Затем в методе приема делегата на Main, если логин был успешным, нажмите экран администратора .. тогда, когда вы нажмете назад, вам не придется обойти вход в систему.

Если это имеет смысл.

Я также предлагаю прочитать iOS Human Interface Guidelines, чтобы понять, какие элементы пользовательского интерфейса лучше всего работают с ситуациями.