Pregunta

Estoy en clase de situación que tengo que comenzar con una aplicación basada en la ficha y que necesito una vista dividida para una o más pestañas. Pero parece que la división de objeto controlador de vista no se puede añadir a la tabBarController. (Aunque objeto barra de pestañas se puede añadir a la splitviewcontroller).

El problema puede ser visto otherways: Tengo una pantalla completa en la parte izquierda tengo una vista de tabla cuando se selecciona cualquier fila en la tabla de un popover debe salir señalando esa fila. Ahora, cuando cualquier fila de la popover se selecciona las filas en esta popover viene de la izquierda debajo de la fila seleccionada (sólo esta fila sería visible) y otro popover sale de la fila seleccionada. (Breadcrumb tipo de navegación)

Creo que estoy claro en lo que he explicado. Así que chicos alguna idea o arounds de trabajo?

Por favor, hágamelo saber si no tengo claro en mi pregunta.

Gracias,

Madhup

¿Fue útil?

Solución 3

Hice una aplicación de ejemplo. y descubrimos que lo puede hacer como mediante programación:

- (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.

Otros consejos

Uso del constructor de interfaces, crear un controlador de vista dividida y un controlador de la barra de pestañas y vincularlos a sus puntos de venta:

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

En su aplicación didFinishLaunchingWithOption delegado, asignar el 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 sólo 1 pestaña en este caso), que se muestra correctamente en todas las orientaciones.

He escrito una subclase para la UISplitViewController que escuchar los cambios a la orientación del dispositivo y orientar en consecuencia. Con esta clase, ahora puedo colocar División de opiniones dentro de un UITabBarController y cada vista dividida se comportará correctamente después de la rotación, incluso si no es la pestaña situada en primer plano. He desplegado con éxito esta en TexLege y fue aprobado para su uso en la App Store, pero su experiencia puede variar. Por favor, vea el repositorio en Github.

No dude en horquilla y modificarlo, y siempre estoy interesado en escuchar los comentarios (o quejas) al respecto. https://github.com/grgcombs/IntelligentSplitViewController

Para permitir que un tabBarController aparece como una vista maestra para splitviewcontroller debe reescribir tabBarController por lo que apoyará o orientaciones (por lo que dicen, utilizando una categoría para el UITabBarController clase)

Ver mi post sobre el reequipamiento controladores de vista de división para una interfaz de barra de pestañas existente: http://markivsblog.blogspot.com/2010/04/retrofitting-ipad-uisplitviewcontroller.html

He creado una subclase UITabBarController que se propaga correctamente los mensajes de rotación para todos UISplitViewControllers que contiene. Esto mantiene el estado interno correcto de los UISplitViewControllers. Sin embargo, uno de los métodos de delegado SplitViewController no se llama si el SplitViewController no es visible, por lo que cuenta para este en el controlador de la vista de detalle viewWillAppear método. He confirmado 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

Tenga en cuenta que OS 3.2 hace no proporciona el soporte adecuado para una SplitView como una vista de barra de pestañas.

Puede que sea el "trabajo" pero va a tener errores - la más grande es que un cambio de orientación realizado en vista de otra pestaña a menudo se propagan a la vista de la ficha SplitView adecuadamente, por lo que la vista va loco cuando vuelva a ella (vista lateral izquierda se hace cargo de la pantalla, o el artículo barbutton no se encuentra, etc.).

He llegado a la conclusión de que tengo que crear mi propia SplitView para su uso en un tabBarController debido a este problema.

Me habían oído rumores de que Apple estaba trabajando en una solución, pero ha sido meses y no hay actualizaciones del sistema operativo del iPad han ocurrido -. Quizá OS 4 para el iPad lo abordará

Puede utilizar IB para construir y modificar Tabtab 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;

}

Hemos tenido éxito en tener un UISplitViewController dentro de un UITabViewController en el iPad con iOS5 +.

para hacer una larga historia corta: funciona:

  • fuera de la caja si acepta una división también en el retrato;
  • con un poco de trabajar, si usted quiere tener la vista maestra escondida en el retrato, y hacer que aparezca únicamente a tocar un botón.

El truco en el segundo caso es utilizar el IntelligentSplitViewController (ver unos pocos puestos hacia arriba, dar gracias Greg Combs) o similarmente extender una UISplitVC, y tener cuidado de que el delegado de la subclase del controlador SplitView siempre es un objeto vivo.

Hemos detallado el proceso en:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top