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

Я пытаюсь реализовать структурированный пользовательский интерфейс, как в приложении 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 ответов

Решение

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

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

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

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

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

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

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

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

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

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

Если это правда, возможно ли, что 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];
}

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

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

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

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

appDelegate.window.rootViewController = myNavControllerInstance;

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

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

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

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

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

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

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

Другие вопросы по тегам