Контроллер панели вкладок внутри контроллера навигации или общий доступ к корневому представлению навигации - PullRequest
79 голосов
/ 23 февраля 2009

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

Итак, похоже, что иерархия реализации:

  • UINavigationController
    1. Счета : UITableViewController
    2. UITabBarController
      1. Твиты : UITableViewController
        • Подробный вид твита / пользователя / и т. Д.
      2. Ответы : UITableViewController
      3. ...

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

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

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

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

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

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

Ответы [ 9 ]

63 голосов
/ 23 февраля 2009

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

34 голосов
/ 30 апреля 2009

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

10 голосов
/ 23 февраля 2009

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

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

9 голосов
/ 23 февраля 2009

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

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

6 голосов
/ 08 января 2010

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

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

[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];
3 голосов
/ 08 октября 2011

Вот как я это сделал. Это фактически выдвигает tabbarcontroller на контроллер навигации. Работает нормально. Я не нашел в документации нигде, что Apple не поддерживает этот способ. Может кто-нибудь дать мне ссылку на это предупреждение?

Если это правда, возможно ли, что яблоко отказывается публиковать мое приложение в 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];
}
3 голосов
/ 17 января 2011

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

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

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

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

appDelegate.window.rootViewController = myNavControllerInstance;
2 голосов
/ 13 ноября 2014

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

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

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

.

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

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

1 голос
/ 12 апреля 2011

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

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

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