Контроллер панели вкладок внутри controllerа навигации или общий доступ к корневой панели навигации

Я пытаюсь реализовать UI, структурированный, как в приложении Tweetie , который ведет себя так: controller представлений верхнего уровня, похоже, является controllerом навигации, чей корневой вид является табличным представлением «Учетные записи». Если вы нажмете на любую учетную запись, она перейдет на второй уровень, который имеет панель вкладок в нижней части. Каждый элемент табуляции показывает другой список и позволяет вам развернуться дальше (на последующих уровнях не отображается панель вкладок).

Таким образом, это похоже на иерархию реализации:

  • UINavigationController
    1. Учетные записи : UITableViewController
    2. UITabBarController
      1. Твиты : UITableViewController
        • Детальный вид твита / пользователя / etc
      2. Ответы : UITableViewController

Кажется, что это работает [^ 1], но, похоже, не поддерживается в соответствии с документацией SDK для -pushViewController:animated: (выделено -pushViewController:animated: ):

viewController : controller представления, который помещается в стек. Он не может быть экземпляром controllerа панели вкладок.

Я хотел бы избежать частных API и т. П., Но я не уверен, почему это использование явно запрещено, даже если оно работает нормально. Кто-нибудь знает причину?

Я подумал о том, чтобы установить controller панели вкладок в качестве основного controllerа, причем каждая из вкладок содержит отдельные навигационные controllerы. Проблема заключается в том, что каждому controllerу nav необходимо разделить один controller корневого представления (а именно таблицу «Учетные записи» в Tweetie ) – это, похоже, не работает: нажатие controllerа таблицы на второй controller управления, похоже, удаляет его от первой. Не говоря уже о том, что все бухгалтерские книги при выборе другой учетной записи, вероятно, были бы болью.

Как я должен реализовать это правильно?

[^ 1]: Контроллер панели вкладок должен быть подclassифицирован, чтобы элемент навигации controllerа панели табуляции на этом уровне оставался в синхронизации с навигационным элементом выбранной вкладки, а controller табличного controllerа отдельной вкладки должен был подталкивать свои собственные подробные представления к self.tabBarController.navigationController вместо self.navigationController .

Два предыдущих ответа UITabBarController – я не использую UITabBarController в Tweetie. Достаточно легко написать пользовательский XXTabBarController (простой подclass UIViewController ), который с удовольствием попадает в стек навигационного controllerа, но все еще живет философией «controllerа представлений». Каждая «вкладка» в определенном для учетной записи представлении ( Tweets / Replies / Messages ) является собственным controllerом представления, и, насколько это возможно, они обмениваются на экране обычным UITabBarController .

Я создаю приложение, которое использует аналогичную навигационную среду для Tweetie. Я написал сообщение о том, как это сделать на моем блоге http://www.wiredbob.com, который также ссылается на исходный код. Это полный шаблон, который вы можете использовать и использовать в качестве основы для другого проекта. Удачи!

Можно добавить UITabBar в любой UIViewController. Таким образом, вам не нужно нажимать UITabBarController и, следовательно, оставаться в рамках принципов API Apple.

В построителе интерфейса UITabBar находится под «Windows, Views & Bars» в Cocoa Touch Library.

Я делаю это в нескольких моих приложениях. Трюк добавления панели вкладок в приложение на основе navigationController – НЕ использовать TabBarController. Добавьте панель просмотра в представление, сделайте controller представления для этого вида TabBarDelegate и ответьте на выбор пользователя на панели вкладок в коде controllerа вида.

Я использую Tab Bars для добавления дополнительных представлений в представление панели вкладок в виде подзадач, для перезагрузки табличного представления с различными наборами данных, для перезагрузки UIPickerView и т. Д.

Я боролся за прошлый час, чтобы реализовать UITabBar потому что он будет скрыт, когда я UITabBar отобразить мой взгляд; то я нашел этот пост :

В принципе, убедитесь, что вы ввели новое представление под панелью вкладок в соответствии с этой строкой кода:

 [self.view insertSubview:tab2ViewController.view belowSubview:myTabBar]; 

В моем приложении controller корневого представления является controllerом UINavigation. В определенный момент в приложении мне нужно отобразить UITabBar. Я попытался реализовать UITabBar в UIView в иерархии навигации, как и некоторые из предыдущих сообщений, и это работает. Но я обнаружил, что мне нужно больше поведения по умолчанию, которое предоставляет controller табуляции, и я нашел способ использовать UITabBarController с controllerом UINavigation:

1) Когда я хочу отобразить представление UITabBarController, я делаю следующее:

 MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; appDelegate.window.rootViewController = myUiTabBarControllerInstance; 

2) Когда я хочу вернуться туда, где был в иерархии навигации, я делаю это:

 appDelegate.window.rootViewController = myNavControllerInstance; 

Вот как я это сделал. На самом деле это приводит к тому, что controller навигации настраивается на навигационный controller. Он работает нормально. Я не нашел нигде в документации, что яблоко не поддерживает этот способ. Может ли кто-нибудь дать мне ссылку на это предупреждение?

Если это правда, возможно ли, что яблоко откажется опубликовать мое приложение в appstore?

 -(void)setArrayAndPushNextController { MyFirstViewController *myFirstViewController = [[MyFirstViewController alloc] init]; MySecondViewController *mySecondViewController = [[MySecondViewController alloc] init]; myFirstViewController.array = self.array; NSArray *array = [[NSArray alloc] initWithObjects:myFirstViewController, mySecondViewController, nil]; UITabBarController *tab = [[UITabBarController alloc] init]; tab.viewControllers = array; [array release]; UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"first title" image:nil tag:1]; UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"second title" image:nil tag:2]; myFirstViewController.tabBarItem = item1; mySecondViewController.tabBarItem = item2; [self stopAnimatingSpinner]; [self.navigationController pushViewController:tab animated:YES]; [tab release]; [item1 release]; [item2 release]; } 

Этого можно добиться, просто вставив TabBarController в controller навигации. В раскадровке:

  1. Перетащите ViewController
  2. Нажмите на сцену ViewController
  3. Нажмите на редакторе >> Вставить в >> Контроллер навигации.
  4. Перетащите кнопку на том же ViewController.
  5. Перетащите вкладку TabBarController
  6. Подключите кнопку на ViewController к TabBarController, нажав кнопку Segue Action.

В этом случае только controller RootViewController TabBarController будет находиться в стеке controllerа навигации. Все элементы TabBarItems будут иметь панель навигации наверху, и пользователь может перейти на главный экран в любое время, независимо от выбранного TabBarItem

Это можно сделать на любом ViewController в стеке controllerа навигации.

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

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

http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/

Давайте будем гением компьютера.