Различные значения (nil и non-nil) для self.navigationController в зависимости от расположения стека

У меня есть подкласс UIViewController, который обращается к self.navigationController в viewDidLoad :. В зависимости от того, где он находится в стеке представлений, я либо получу NavigationController, либо получу nil.

Если мой стек - «RootViewController -> MyViewController», я получаю действительный указатель.

Если мой стек - «RootViewController -> AnotherViewController -> MyViewController», я получаю ноль.

В обоих случаях MyViewController помещается в стек с помощью:

[self.navigationController pushViewController:self.myViewController 
                           animated:YES];

Это заставило меня застрять, потому что мне нужно иметь возможность вставить другой ViewController в стек над MyViewController, который отлично работает в первом случае, но, очевидно, не работает во втором.


person Travis Jensen    schedule 05.04.2009    source источник


Ответы (2)


из всего, что я могу видеть, UIViewController self.navigationController разработан, чтобы всегда возвращать соответствующий UINavigationController, пока UIViewController существует в стеке UINavigationController. Вероятно, это один из тех случаев, когда я, кажется, сталкиваюсь с самим собой чаще, чем хотелось бы, когда простая ошибка кодирования маскируется под что-то гораздо более сложное. В этих случаях мне обычно бывает удачно настраивать совершенно новый проект Xcode с минимальным кодом, необходимым для воспроизведения проблемы, и чаще всего в этом процессе я нахожу исправление для чего-то, что я упустил, что затем можно легко применить в основном проекте. . Извините, я не могу предложить больше подробностей, но то, что вы описываете, похоже, противоречит дизайну инфраструктуры Cocoa Touch, и если вы все еще можете воспроизвести это в минимальном проекте Xcode, написанном в строгом соответствии с документацией, это может быть Хорошая идея - отправить отчет об ошибке в Apple. Надеюсь, вы просто найдете что-то простое, что упустили из виду, и через несколько минут начнете пинать себя =)

person Adam Alexander    schedule 06.04.2009
comment
По сути, это была проблема. Это обоюдоострый меч, состоящий в глотании посланных ему сообщений. :) Взять пару выходных и вернуться обратно - это очень полезно для поиска подобных проблем. - person Travis Jensen; 09.04.2009

Обычно я создаю подкласс UIViewController и добавляю метод для установки navigationController. Нет причин не использовать это как чтение / запись, особенно с учетом того, как часто классы Apple решают не устанавливать navigationController (или parentController, если на то пошло), даже если они находятся в одном стеке.

person Andres Kievsky    schedule 19.08.2010