2015-12-13 2 views
0

У меня есть корень UINavigationController и хочу инициализировать его с экземпляром UITabBarController, что-то вроде этого:Init UINavigationController с UITabBarController как корень

TabBarController * viewController = [[TabBarController alloc] init]; 
UINavigationController navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
self.window.rootViewController = navigationController; 
[self.window makeKeyAndVisible]; 

согласно документации initWithRootViewController: метода, это плохая идея:

Контроллер вида, который находится в нижней части навигации Стек. Этот объект не может быть экземпляром класса UITabBarController .

Так интересно:

  1. Почему у нас такое ограничение?
  2. ... почему это работает и не выбрасывает никаких исключений? Существуют ли какие-либо побочные эффекты такого подхода? Я пытаюсь повторно использовать один контроллер навигации на всех вкладках моего контроллера панели вкладок, и до сих пор код сверху работает очень хорошо.

Что мне нужно, чтобы 1) иметь согласованный NavBar на всех моих вкладках (но с разными названиями и значками слева/справа 2) Некоторые вкладки должны поддерживать разворот навигации 3) Мне не нужна панель вкладок при переключении на более глубокие элементы иерархии экранов.

EDIT

Я просто понял, что Skype для прошивки является хорошим примером того, что я пытаюсь достичь: она работает точно так же, как мое приложение в терминах вкладок и навигации.

+1

Я не знаю технической причины, но мне кажется, что это приведет к запутанному опыту пользователя; Имея контроллер табуляции в корне контроллера навигации, пользователь должен полностью перейти к корню, чтобы переключать вкладки; В общем случае для контроллера панели вкладок вы заметите, что вы вставляете отдельный контроллер навигации на каждую вкладку, тогда пользователь может быстро переключаться между вкладками, не теряя места в стеке просмотров каждой таблицы. – Paulw11

+0

@ Paulw11 благодарит вас за ваш комментарий. В настоящее время я использую один контроллер nav для всех своих вкладок.Я видел аналогичные рекомендации по внедрению каждого UIViewController каждой вкладки в UINavigationController, но ... зачем мне это нужно? Я понимаю концептуальную идею этого подхода, но не могу понять, почему иметь 5 навигационных контроллеров, а не только один ... Что мне нужно, так это 1) иметь согласованный NavBar во всех моих вкладках. 2) На некоторых вкладках есть развертка. – fraggjkee

+1

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

ответ

1

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

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

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

Тот факт, что в конечном итоге это просто контроллер контроллеров, также является причиной его работы. Контроллер контроллеров не обращает внимания на то, что вид контроллеров, которыми он управляет.

Если вы опишете свой пример использования, вы сможете получить более конкретный совет, если это хорошая идея в вашем случае или нет. Возможно, вы захотите рассмотреть возможность использования UIToolbar.

+0

«Полагаю, причина в том, что если вы нажмете еще один контроллер представления в стек навигации, он будет выталкивать контроллер панели вкладок в сторону в стандартной анимации» <- Я думал, что это нормальное и ожидаемое поведение, но просто реализовано что приложение AppStore работает точно так, как вы описали. Меня, наверное, смутил мой Android-фон :) Спасибо! – fraggjkee

+0

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

+0

, кстати, Skype для iOS нарушает требования и работает точно так же, как мое приложение – fraggjkee