Как мне управлять обменом UINavigationController в и из другого UIViewController? - PullRequest
0 голосов
/ 11 февраля 2010

Вот что у меня есть:

  • Файл MainWindow.xib, сконфигурированный с одним UIViewController (подкласс к RootViewController). Этот кончик загружается при запуске приложения.

  • RootViewController имеет два ивара, пользовательский подкласс UIViewController и UINavigationController. Оба они загружены из перьев.

Когда приложение запускается, оба ivars инициализируются из соответствующих перьев, а затем добавляется UIViewController.view в качестве подпредставления RootViewController.view.

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

Перо UINavigationController и базовая функциональность были протестированы в отдельном проекте, но RootViewController не было.

Итак, мой вопрос, могу ли я это сделать? Я успешно поменял местами другие контроллеры вида, но не UINavigationController. Я видел некоторые документы, которые наводят меня на мысль, что это может быть глупое поручение, но я еще не убедил себя в этом.

Решение (Kinda):

Я нашел решение (обходной путь? Взломать?), Но оно приводит к еще нескольким вопросам. Я использовал nib для UINavigationController. Вместо этого я загрузил rootViewController моего UINavigationController из пера, а затем программно создал UINavigationController с помощью initWithRootViewController:.

  NavRootViewController *navRoot = [[NavRootViewController alloc] initWithNibName:@"NavRootViewController" bundle:nil];
  navigationController = [[UINavigationController alloc] initWithRootViewController:navRoot];
  [navRoot release];

Это работает, как я ожидаю. Что приводит меня к выводу, что свойство rootViewController для UINavigationController не было установлено правильно, когда я загружал навигационный контроллер из Nib. И вопрос в том, почему? Должно ли это?

Ответы [ 3 ]

1 голос
/ 15 декабря 2011

В некоторых случаях viewDidLoad и viewDidAppear или awakeFromNib могут вызываться каждый раз, когда вы добавляете UINavigationController обратно в стек UIViewControllers. Кажется, что когда типичный код выполняется из вашего AppDelegate, то Window или что-то за кадром делает что-то особенное для UINavigationController, чего не делает presentModalViewController.

1 голос
/ 15 декабря 2011

Кроме того, когда вы видите, что нечто подобное происходит в одном случае, но не в другом, может быть полезно либо создать подкласс и указать точку на этом подклассе, либо, если у вас уже есть подкласс, использовать это.

В подклассе переопределите все различные init :, initWithNibName: bundle :, viewDidLoad :, viewWillAppear :, viewDidAppear: и любые другие соответствующие методы, и в этих переопределениях просто NSLog ("") что-то о том, какой метод это (возможно со значениями параметров) и вызовите супер реализацию.

Это даст вам наблюдаемую «дорожку» того, какие методы вызываются в каком порядке, и вы можете установить точку останова, чтобы увидеть, откуда происходит этот вызов.

Это даст вам достаточно информации, чтобы найти пропущенные вызовы методов, и тогда вы сможете решить правильную проблему либо здесь, либо через регистрацию радара, либо ...

0 голосов
/ 11 февраля 2010

Я думаю, вы, возможно, упустили концептуальный момент.

UINavigationController управляет контроллерами представления вместо представлений. Он контролирует, когда и где загружаются сами контроллеры представления. Сами представления загружаются только как побочный эффект нажатия и выталкивания их соответствующих контроллеров.

Следовательно, размещение контроллера навигации внутри контроллера представления редко имеет смысл.

Если я понимаю, что вы пытаетесь сделать правильно, вы должны действительно установить RootController в качестве свойства rootController для UINavigationController (да, номенклатура очень запутанная.) Затем, когда происходит событие свопинга, у вас должен быть контроллер навигации нажмите следующий вид. Представление RootController исчезнет и будет заменено другим. затем вы можете повторить процесс для произвольного числа контроллеров представления.

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

...