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



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



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





  • UINavigationController



    1. счета:UITableViewController


    2. UITabBarController



      1. твиты:UITableViewController


        • посмотреть подробнее твит/пользователей/и т. д.




      2. ответы:UITableViewController

      3. ...






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




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




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



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



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



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

669   9  

9 ответов:

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

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

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

в interface builder UITabBar находится в разделе "Windows, Views & Bars"в библиотеке Cocoa Touch.

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

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

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

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

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

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

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

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

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

appDelegate.window.rootViewController = myNavControllerInstance;

вот как я это сделал. Это фактически толкает 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];
}

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

  1. перетащите ViewController
  2. нажмите на сцену ViewController
  3. нажмите на редактор > > вставить в > > навигационный контроллер.
  4. перетащите кнопку на том же ViewController.
  5. перетащите TabBarController
  6. подключите кнопку на ViewController к TabBarController через push Segue Действие.

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

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

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

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

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

Comments

    Ничего не найдено.