Контроллер панели вкладок внутри контроллера навигации или общий доступ к корневому представлению навигации
Я пытаюсь реализовать структурированный пользовательский интерфейс, как в приложении Tweetie, который ведет себя так: контроллер представления верхнего уровня выглядит как контроллер навигации, корневое представление которого является табличным представлением "Счета". Если вы щелкнете по любой учетной записи, она перейдет на второй уровень, в нижней части которого находится панель вкладок. Каждый элемент вкладки отображает отдельный список и позволяет вам углубляться (последующие уровни не показывают панель вкладок).
Итак, похоже, что иерархия реализации:
UINavigationController
- Счета:
UITableViewController
UITabBarController
- Твиты:
UITableViewController
- Подробный вид твита / пользователя / и т. Д.
- Ответы:
UITableViewController
- ...
- Твиты:
- Счета:
Кажется, это работает [^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 в контроллер навигации. В раскадровке:
- Перетащите ViewController
- Нажмите на сцену ViewController
- Нажмите на редактор >> Встроить >> Контроллер навигации.
- Перетащите кнопку на тот же ViewController.
- Перетащите TabBarController
- Подключите кнопку на ViewController к TabBarController с помощью push Segue Action.
В этом случае только RootViewController TabBarController будет в стеке контроллера навигации. Все элементы TabBarItems будут иметь панель навигации вверху, и пользователь сможет в любой момент перейти на главный экран, независимо от выбранного элемента TabBarItem.
Это может быть сделано на любом ViewController в стеке контроллера навигации.
Если это работает, пожалуйста, предложите мне, как повысить репутацию, чтобы я мог опубликовать изображения и код в следующем ответе.:)
Я написал сообщение в блоге о том, как я подошел к этой проблеме. Для меня использование модального представления было более простым решением, чем создание пользовательской реализации панели вкладок.
http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/