2013-09-24 3 views
7

У меня есть следующий код:IOS, 7: UINavigationBar из синхронизации с UINavigationController

NSArray* stack = self.navigationController.viewControllers; 
NSArray* newStack = @[stack[0], stack[2]]; 
[self.navigationController setViewControllers:newStack animated:NO]; 

stack содержит 3 контроллеров представления. Проблема в том, что панель навигации не удаляет UINavigationItems для соответствия, поэтому self.navigationController.navigationBar.items.count все еще возвращает 3 после запуска этого кода. Возвращение приводит вас в странное состояние, когда у вас есть кнопка возврата вверху, которую вы можете нажимать, но она просто исчезает, а не возвращает вас дальше.

Это ошибка в iOS 7 или я просто пытаюсь сделать что-то действительно глупое? Каков наилучший способ исправить или обойти это?

+1

Любые ответы или исправления? – nicktmro

ответ

0

Поведение, которое вы описываете, представляет собой поврежденный стек контроллера навигации. Вероятно, это связано с тем, что вы неправильно используете навигационный контроллер. У меня нет большого контекста из кода здесь, но я предполагаю, что вы пытаетесь перейти к контроллеру корневого представления? Я думаю, что это, вероятно, больше того, что вам потребуется:

https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/occ/instm/UINavigationController/popToRootViewControllerAnimated:

вы тогда хотите добавить пользовательскую кнопку назад с чем-то вроде так:

UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(yourMethodToPopToRoot)]; 
//yourMethodToPopToRoot is a method you create that runs popToRootViewController 
self.navigationItem.leftBarButtonItem = backButton; 

Любые вопросы, дайте мне знать.

9

У навигационной панели есть своя стека предметов, которая не обновляется до тех пор, пока не увидит viewDidAppear.

Это означает, что если мы воссоздаем стек навигационных контроллеров в viewDidLoad, то есть setViewControllers: когда мы дойдем до viewDidAppear, мы добавим текущий элемент в стек «элементов» баров, и поэтому в стеке элементов управления UINavController не будет в синхронизации со стеком элементов UINavBar. Кажется, это ошибка iOS 7.

В iOS 6.0 2 разных стека не выходят из синхронизации независимо от того, где мы устанавливаем новый стек viewControllers.

Так что попробуйте переместить свой код в viewDidAppear и посмотреть, устраняет ли это проблему. Держу пари, что так будет, потому что для меня это было так.

+0

Также видим это в iOS 9.2.1. Вот минимально воспроизводимый пример, если кому-то интересно - http://pastebin.com/Ef8Z6yWW – Anurag

Смежные вопросы