ipad uitabbarcontroller iphone-sdk-3.2 uisplitviewcontroller uipopovercontroller

ipad - UISplitViewController en un TabBar(UITabBarController)?



iphone-sdk-3.2 uipopovercontroller (9)

Creé una subclase UITabBarController que propaga correctamente los mensajes de rotación a todos los UISplitViewControllers que contiene. Esto mantiene el estado interno correcto de UISplitViewControllers. Sin embargo, uno de los métodos de delegado SplitViewController no se llama si el controlador SplitViewController no está visible, así que lo explico en el método viewWillAppear del controlador de vista detallada. Confirmé que esto funciona en 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

Estoy en una especie de situación en la que necesito comenzar con una aplicación basada en pestañas y en la que necesito una vista dividida para una o más pestañas. Pero parece que el objeto controlador de vista dividida no se puede agregar al tabbarController. (Aunque el objeto tabbar se puede agregar al splitviewcontroller).

El problema se puede ver de otra forma: tengo una pantalla completa en la parte izquierda. Tengo una vista de tabla cuando se selecciona una fila en la tabla. Debe aparecer un popover señalando esa fila. Ahora, cuando se selecciona cualquier fila en el popover, las filas en este popover aparecen a la izquierda debajo de la fila seleccionada (solo esta fila sería visible) y sale otro popover de la fila seleccionada. (Tipo de navegación de la ruta de navegación)

Creo que tengo claro lo que expliqué. Así que chicos, ¿alguna idea o solución alternativa?

Por favor, avíseme si no tengo claro mi pregunta.

Gracias,

Madhup


He escrito una subclase para UISplitViewController que escuchará los cambios en la orientación del dispositivo y se orientará en consecuencia. Con esta clase, ahora puedo colocar vistas divididas dentro de un UITabBarController y cada vista dividida se comportará correctamente durante la rotación, incluso si no es la pestaña más adelantada. Implementé esto con éxito en TexLege y fue aprobado para su uso en la App Store, pero su millaje puede variar. Por favor mira el repositorio en Github.

Siéntase libre de copiar y modificar, y siempre estoy interesado en escuchar comentarios (o quejas) al respecto. https://github.com/grgcombs/IntelligentSplitViewController


Hice una aplicación de muestra. y descubrimos que podemos hacerlo programáticamente como:

- (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''s current view as a subview of the window [tabBarController setViewControllers:tabArray]; [window addSubview:tabBarController.view]; [window makeKeyAndVisible]; return YES; }

Espero que esto ayude.


Logramos tener un UISplitViewController dentro de un UITabViewController en iPad con iOS5 +.

para abreviar: funciona:

  • de fábrica si acepta una división también en retrato;
  • con un poco de trabajo, si desea tener la vista maestra oculta en el retrato, y hacer que aparezca solo al tocar un botón.

El truco en el segundo caso es usar IntelligentSplitViewController (ver algunas publicaciones arriba, gracias a Greg Combs) o extender de manera similar un UISplitVC, y tener cuidado de que el delegado de la subclase del controlador de vista dividida sea siempre un objeto activo.

Hemos detallado el proceso en:

https://devforums.apple.com/message/763572#763572


Para que un tabbarcontroller aparezca como una vista maestra para splitviewcontroller, debe volver a escribir tabbarcontroller para que admita u oriente (por ejemplo, utilizando una categoría para la clase UITabBarController)


Puede usar IB para crear tabtab y modificar pestañas para 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;

}


Tenga en cuenta que OS 3.2 no proporciona el soporte adecuado para una vista dividida como una vista tabbar.

Puedes hacerlo funcionar, pero tendrá errores: el más grande es que un cambio de orientación realizado en la vista de otra pestaña a menudo no se propagará correctamente a la vista de la vista dividida, haciendo que la vista se vuelva loca cuando vuelvas a ella (lado izquierdo). la vista toma la pantalla, o el elemento del botón de barra falta, etc.).

Llegué a la conclusión de que tengo que crear mi propia vista dividida para su uso en un tabBarController debido a este problema.

Había escuchado rumores de que Apple estaba trabajando en una solución, pero han pasado meses y no se han producido actualizaciones de SO del iPad, tal vez OS 4 para el iPad lo abordará.


Usando el constructor de interfaz, cree un controlador de vista dividida y un controlador de barra de pestañas y conéctelos a sus puntos de venta:

@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController; @property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController;

En su aplicación, delegue didFinishLaunchingWithOption , asigne su controlador de vista dividida al controlador de la barra de pestañas:

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];

Esto creará un controlador de barra de pestañas (con solo 1 pestaña en este caso), que se muestra correctamente en todas las orientaciones.