Скрытый UINavigationController внутри UITabBarController

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

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

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

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

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

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


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

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


person adam    schedule 12.11.2008    source источник


Ответы (3)


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

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

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

person Alex    schedule 13.11.2008

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

person wisequark    schedule 12.11.2008

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

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

person Kendall Helmstetter Gelner    schedule 12.11.2008