UISplitViewController в TabBar (UITabBarController)?
Я в такой ситуации, что мне нужно начать с приложения на основе табуляции, и в этом мне нужно разделенное представление для одной или нескольких вкладок. Но похоже, что объект контроллера split view нельзя добавить в tabbarController. (Хотя объект табуляции можно добавить в контроллер splitview).
Проблема может быть видна иначе: у меня есть полный экран в левой части. У меня есть представление таблицы, когда в таблице выбрана любая строка, в которой должна появиться popover, указывающая на эту строку. Теперь, когда выбрана любая строка в popover, строки в этом popover попадают влево под выбранной строкой (только эта строка будет видна), а другая выбрана из выбранной строки. (Тип навигации по бегущим голосам)
Думаю, я понимаю, что объяснил. Так ребята какие-нибудь идеи или работают вокруг?
Пожалуйста, дайте мне знать, если я не понимаю в своем вопросе.
Спасибо,
Madhup
Ответы
Ответ 1
Я сделал образец приложения. и нашел, что мы можем сделать это программно, как:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSMutableArray *array = [NSMutableArray array];
NSMutableArray *tabArray = [NSMutableArray array];
UISplitViewController *splitViewConntroller = [[UISplitViewController alloc] init];
MainViewController *viewCont = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
[array addObject:viewCont];
[viewCont release];
viewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[array addObject:viewCont];
[viewCont release];
[splitViewConntroller setViewControllers:array];
[tabArray addObject:splitViewConntroller];
[splitViewConntroller release];
array = [NSMutableArray array];
splitViewConntroller = [[UISplitViewController alloc] init];
viewCont = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
[array addObject:viewCont];
[viewCont release];
viewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[array addObject:viewCont];
[viewCont release];
[splitViewConntroller setViewControllers:array];
[tabArray addObject:splitViewConntroller];
[splitViewConntroller release];
// Add the tab bar controller current view as a subview of the window
[tabBarController setViewControllers:tabArray];
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
return YES;
}
Надеюсь, что это поможет.
Ответ 2
Используя конструктор интерфейса, создайте контроллер разделенного представления и контроллер панели вкладок и привяжите их к своим выходам:
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController;
В делетете приложения didFinishLaunchingWithOption
назначьте контроллер разделенного представления контроллеру панели вкладок:
splitViewController.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Title" image:nil tag:0] autorelease];
NSArray *controllers = [NSArray arrayWithObjects:splitViewController, /* other controllers go here */ nil];
tabBarController.viewControllers = controllers;
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
В этом случае будет создан контроллер панели вкладок (в этом случае будет только одна вкладка), которая будет отображаться правильно во всех ориентациях.
Ответ 3
Я написал подкласс для UISplitViewController, который будет прослушивать изменения в ориентации устройства и соответствующим образом ориентироваться. С этим классом я могу теперь размещать разделенные виды в UITabBarController, и каждое разделенное представление будет корректно вести себя при вращении, даже если оно не является самой передней вкладкой. Я успешно развернул это в TexLege и был одобрен для использования в App Store, но ваш пробег может отличаться. См. Репозиторий в Github.
Не стесняйтесь развивать и модифицировать его, и мне всегда интересно услышать комментарии (или жалобы) об этом. https://github.com/grgcombs/IntelligentSplitViewController
Ответ 4
Чтобы позволить tabbarcontroller отображаться как главное представление для splitviewcontroller, вы должны переписать tabbarcontroller так, чтобы он поддерживал или ориентировал (скажем так, используя категорию для класса UITabBarController)
Ответ 5
См. мой пост о дооснащении контроллеров разделенных видов для существующего интерфейса панели вкладок: http://markivsblog.blogspot.com/2010/04/retrofitting-ipad-uisplitviewcontroller.html
Ответ 6
Я создал подкласс UITabBarController, который правильно передает сообщения о ротации всем содержащимся в нем UISplitViewControllers. Это поддерживает правильное внутреннее состояние UISplitViewControllers. Тем не менее, один из методов делегирования SplitViewController не вызывается, если SplitViewController не отображается, поэтому я учитываю это в виде viewLillAppear. Я подтвердил, что это работает в iOS5.0 - iOS6.1
OSTabBarController.m
#import "OSTabBarController.h"
@implementation OSTabBarController
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
for(UIViewController *targetController in self.viewControllers){
if(targetController != self.selectedViewController && [targetController isKindOfClass:[UISplitViewController class]]){
[targetController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
}
}
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
for(UIViewController *targetController in self.viewControllers){
if(targetController != self.selectedViewController && [targetController isKindOfClass:[UISplitViewController class]]){
[targetController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
}
}
}
@end
DetailViewController
@implementation OSDetailViewController
-(void)viewWillAppear:(BOOL)animated{
//the splitViewController:willHideViewController:withBarButtonItem:forPopoverController: may not have been called
if(!UIInterfaceOrientationIsPortrait(self.interfaceOrientation)){
self.navigationItem.leftBarButtonItem = nil;
}
}
#pragma mark - UISplitViewControllerDelegate Methods
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
}
- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
}
@end
Ответ 7
Имейте в виду, что OS 3.2 делает не предоставление надлежащей поддержки для splitview в виде табло.
Вы можете сделать это "работа", но у него будут ошибки. Самое большое, что изменение ориентации, сделанное в другом представлении табуляции, часто не распространяется на представление вкладки splitview должным образом, делая вид пустым, когда вы возвращаетесь к нему (вид слева сбоку захватывает экран, или элемент панели отсутствует, и т.д.).
Я пришел к выводу, что я должен создать свой собственный splitview для использования в tabBarController из-за этой проблемы.
Я слышал слухи о том, что Apple работает над исправлением, но прошло уже несколько месяцев, и никаких обновлений для iPad не произошло - возможно, OS 4 для iPad рассмотрит ее.
Ответ 8
Вы можете использовать IB для создания tabtab и изменения вкладок в splitviewcontroller.
-(void) makeSplitViewController {
NSMutableArray *controllers = [NSMutableArray arrayWithArray:tabBarController.viewControllers];
int index = 0;
for (UIViewController *controller in tabBarController.viewControllers) {
if ([controller.tabBarItem.title isEqualToString:@"Stock"]) {
stockDetailController = [[StockDetailController alloc] initWithNibName:@"StockDetailController" bundle:nil];
stockMasterController = [[StockMasterController alloc] initWithStyle:UITableViewStylePlain];
stockMasterController.navigationItem.title = date;
stockMasterController.stockDetailController = stockDetailController;
UINavigationController *nav = [[[UINavigationController alloc] initWithRootViewController:stockMasterController] autorelease];
splitViewController = [[UISplitViewController alloc] init];
splitViewController.tabBarItem = controller.tabBarItem;
splitViewController.viewControllers = [NSArray arrayWithObjects:nav, stockDetailController, nil];
splitViewController.delegate = stockDetailController;
[controllers replaceObjectAtIndex:index withObject:splitViewController];
}
index++;
}
tabBarController.viewControllers = controllers;
}
Ответ 9
Нам удалось установить UISplitViewController внутри UITabViewController на iPad с iOS5 +.
сделать короткую короткую историю: она работает:
- из коробки, если вы принимаете разделение также в портрете;
- с немного
работа, если вы хотите, чтобы главный вид был скрыт в портрете, и
если он появляется только при нажатии кнопки.
Фокус во втором случае - использовать IntelligentSplitViewController (см. несколько сообщений вверх, thanx Greg Combs) или аналогичным образом расширить UISplitVC и быть осторожным, чтобы делегат подкласса контроллера splitview всегда являлся живым объектом.
Мы подробно описали процесс:
https://devforums.apple.com/message/763572#763572