Скрытый UINavigationController внутри UITabBarController - PullRequest
3 голосов
/ 12 ноября 2008

У меня есть приложение с 5 UIViewController с внутри каждого соответствующего UINavigationController, все скрыто внутри UITabBarController, которое отображает 5 вкладок в нижней части экрана.

Я хочу отобразить еще один UIViewController (внутри UINavigationController) при нажатии кнопки диалога.

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

Если я добавлю [UINavigationController view] к [self window], UITabBar будет закрыт. Если я добавлю его на любой другой слой, UINavigationController добавит компенсацию, которую он имеет для строки состояния, поэтому он окажется ниже, чем ожидалось.

Решением может быть добавление 6-го UINavigationController к UITabBar с остальными, но со скрытым tabBarItem. Затем я могу показать его и скрыть, используя свойство tabBar s selectedIndex.

Доступ к tabBarItem через UIViewController не показывает очевидного способа сделать это.


@ wisequark, я думаю, вы совершенно не поняли и почти переписали архитектуру моего приложения. Однако у меня есть отдельный контроллер навигации для каждого вида, так как они являются взаимоисключающими, и концепция «детализации» отсутствует.

@ Кендалл, это то, что я ожидаю, что мне придется сделать - появится модальное представление с кнопкой скрытия, чтобы вернуть нормальный интерфейс. Но было бы неплохо держать панель вкладок всегда видимой, поэтому мне просто интересно, знает ли кто-нибудь какой-либо способ.

Ответы [ 3 ]

15 голосов
/ 12 ноября 2008

Звучит так, как будто у вас в руках беспорядок. UINavigationController - это отдельный объект, который сильно отличается от UITabBarController. В общем, ваше приложение должно иметь контроллер вкладок, один из вкладок которого загружает UINavigationController, который, в свою очередь, загружает свои представления - не то чтобы оба поддерживают управление различными представлениями. Также неправильно ссылаться на отображение UIViewController, так как такой объект не имеет визуального представления. В случае UINavigationController объект контроллера навигации отвечает за отображение панели навигации и табличного представления (в наиболее распространенном случае) и за управление отображением всех представлений в иерархии навигации. Само по себе оно не имеет соответствующего представления на экране. Аналогично, UITabBarController представляет панель вкладок и отвечает за загрузку и выгрузку представлений и / или контроллеров представления, прикрепленных к кнопкам вкладок. Если бы мы представили это как изображение, это выглядело бы примерно так - альтернативный текст http://img.skitch.com/20081112-2sqp7q4wafa34te1ga337u4k8.png

4 голосов
/ 13 ноября 2008

Похоже, что вы действительно хотите сделать, это представить модальное представление с видимой панелью вкладок. Вы можете добавить свой вид как подпредставление контроллера панели вкладок. Как ни странно, представление панели вкладок - это не сама панель вкладок, а представление, содержащее панель вкладок и представление выбранного элемента.

В качестве альтернативы вы можете попробовать вызвать presentModalViewController: animated: с выбранной вкладкой (т.е. [tabBarController.selectedViewController presentModalViewController: animated:]) в качестве получателя вместо панели вкладок. Кажется, я вспомнил, что делал это один раз (совершенно случайно), и панель вкладок оставалась видимой.

Еще одна мысль: поскольку каждый из пяти ваших контроллеров представления является UINavigationController, вы всегда можете вставить ViewViewController: animated: в выбранный контроллер представления, а затем скрыть кнопку возврата. Ваш вид просто появится без анимации. Но вам нужно помнить, чтобы вынуть контроллер представления из стека всякий раз, когда пользователь переключается на другую вкладку. Это может занять немного больше работы.

2 голосов
/ 12 ноября 2008

Лучшая идея, которую я мог бы придумать, - это нажать модальный контроллер навигации для вашего вида (который скрывал бы панель вкладок, которая вам не нужна), или получить контроллер панели вкладок, текущий выбранный контроллер представления (на самом деле ваш контроллер навигации для вкладки) и вставьте туда свой новый контроллер представления, а затем откройте это представление, когда будет выбрана другая вкладка с делегатом панели вкладок.

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

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