У меня недавно была похожая проблема. Я попробовал буквально все, что нашел в SO и других форумах - ничего не получалось.
В моем случае было модально показано UINavigationController
с простым корневым контроллером, который выдвигал один из двух контроллеров представления (A и B) поверх стека контроллеров при нажатии кнопки A или B соответственно. Контроллер B был тем, который не должен был показывать кнопку возврата. Но все же, иногда это было, иногда нет.
После нескольких часов отладки мне удалось отследить его. Контроллер А был UITableViewController
. Каждый раз, когда я выбираю ячейку в этом контроллере, делегат выталкивает контроллер A из стека. НО. Я также использовал UISearchDisplayController
. Оказалось, что всплывающее представление, когда контроллер поиска все еще был активен, испортило что-то в навигационном контроллере, что сделало невозможным впоследствии скрыть кнопку «Назад» в контроллере B (ну, в конце концов, она оставалась скрытой между viewDidLoad
и viewDidAppear:
, но затем это всегда становилось видимым).
Таким образом, решение (скорее обходное решение) добавляло эту строку туда, где был удален контроллер A:
controllerA.searchDisplayController.active = NO;
// ...
// [self.navigationController popViewControllerAnimated:YES];
Надеюсь, это сэкономит кому-то пару часов.