Почему self.navigationItem.hidesBackButton не работает? - PullRequest
7 голосов
/ 02 апреля 2009

У меня есть UIViewController , который помещается на UINavigationController и отображается в данный момент. Когда я запускаю какую-то асинхронную задачу внутри контроллера представления, я могу установить hidesBackButton для self.navigationItem на ДА , и кнопка «назад» скрыта правильно.

Как только задача будет завершена, и я установлю hidesBackButton обратно на NO (в потоке пользовательского интерфейса, я мог бы добавить, я в этом убедился), ничего случается. Кнопка возврата остается скрытой.

Кто-нибудь видел это раньше? Что сводит меня с ума, так это то, что в моем приложении (в том же приложении) в другой иерархии UINavigationController точно такой же код работает правильно!

Ответы [ 6 ]

4 голосов
/ 03 апреля 2009

Вы вызываете hidesBackButton = NO из потока? Все операции пользовательского интерфейса должны выполняться в основном потоке, иначе они не будут иметь никакого эффекта.

2 голосов
/ 02 апреля 2009

Мне не удалось воспроизвести вашу проблему на моей машине. Тем не менее, я столкнулся с аналогичной проблемой с таблицами, даже когда я обновлял пользовательский интерфейс в главном потоке. но вызов setNeedsDisplay устранил эту проблему.

Можете ли вы попробовать это и посмотреть, работает ли это:

[self.navigationController.navigationBar setNeedsDisplay];

Полагаю, это должно сработать, вам нужно сделать то же самое, НО НА БЛОКЕ НАВИГАЦИИ. пожалуйста, дайте мне знать, если это сработало - поскольку я не могу проверить свое решение, потому что я никогда не получаю эту проблему: -)

1 голос
/ 15 мая 2012

У меня недавно была похожая проблема. Я попробовал буквально все, что нашел в SO и других форумах - ничего не получалось.

В моем случае было модально показано UINavigationController с простым корневым контроллером, который выдвигал один из двух контроллеров представления (A и B) поверх стека контроллеров при нажатии кнопки A или B соответственно. Контроллер B был тем, который не должен был показывать кнопку возврата. Но все же, иногда это было, иногда нет.

После нескольких часов отладки мне удалось отследить его. Контроллер А был UITableViewController. Каждый раз, когда я выбираю ячейку в этом контроллере, делегат выталкивает контроллер A из стека. НО. Я также использовал UISearchDisplayController. Оказалось, что всплывающее представление, когда контроллер поиска все еще был активен, испортило что-то в навигационном контроллере, что сделало невозможным впоследствии скрыть кнопку «Назад» в контроллере B (ну, в конце концов, она оставалась скрытой между viewDidLoad и viewDidAppear:, но затем это всегда становилось видимым).

Таким образом, решение (скорее обходное решение) добавляло эту строку туда, где был удален контроллер A:

controllerA.searchDisplayController.active = NO;

// ...
// [self.navigationController popViewControllerAnimated:YES];

Надеюсь, это сэкономит кому-то пару часов.

1 голос
/ 09 июля 2010

В моем случае я просто должен был дать название представлению, как в: self.navigationItem.title = @ "Меню";

Мэринус

1 голос
/ 02 апреля 2009

Вы пытались использовать метод setHidesBackButton: animated: вместо этого? Возможно, это имеет немного другое поведение.

1 голос
/ 02 апреля 2009

Вы пытались принудительно обновить представление, вызывая setNeedsDisplay? Возможно, ОС не сразу воспринимает изменения, и вам нужно принудительно вызвать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...