En mi UISplitViewController aplicación, he

  • RootViewController – vista controlador en el panel de la izquierda.
  • DetailViewController – vista controlador en el panel de la derecha.

Cuando un elemento (que es en un UITableView) en RootViewController está girada, nueva vista controlador se puede configurar como se muestra a continuación:

[detailViewController setViewControllers:[NSArray arrayWithObjects:newViewController, nil] animated:animated];

//detailPane is my DetailViewController

Todo funciona bastante bien en el modo de paisaje. Sin embargo, no puedo hacer que el UISplitViewController trabajo como lo quiero en modo vertical, es decir, la RootViewController la ventana emergente botón no aparecen correctamente en mi DetailViewController al iniciar y utilizar la aplicación en modo vertical.

Al iniciar la aplicación en modo de retrato, la ventana emergente aparecerá un botón de forma adecuada. Pero después de tocar un elemento en la ventana emergente y un nuevo controlador de vista de que se ha establecido detailViewController, el botón desaparecido. Tengo que girar el dispositivo en posición horizontal y, a continuación, volver a la vertical de nuevo para hacer que el botón aparezca de nuevo.

Me puse mi UISplitViewController del delegado en mi aplicación AppDelegate de la siguiente manera:

self.splitViewController.delegate = self.detailViewController

Y aquí está mi UISplitViewControllerDelegate aplicación

- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem  forPopoverController: (UIPopoverController*)pc {
    NSLog(@"Will hide view controller");
    barButtonItem.title = @"Menu";
    [self.navigationItem setLeftBarButtonItem:barButtonItem];
    self.popoverController = pc;
}

- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
    NSLog(@"Will show view controller")
    NSMutableArray *items = [self.navigationItem.leftBarButtonItems mutableCopy];
    [items removeAllObjects];
    [self.navigationItem setLeftBarButtonItems:items animated:YES];
    [items release];
    self.popoverController = nil;   
}

Cualquier sugerencia o ayuda es muy apreciada.
Gracias.

¿Puedes resolver esto todavía? Tengo el mismo problema.

OriginalEl autor Azu | 2011-10-25

4 Comentarios

  1. 4

    Acaba de llegar con una nueva solución.

    Subclase UINavigationController y aplicar UISplitViewControllerDelegate. Establecer una instancia de esta clase como el derecho ViewController de la splitViewController. Cada vez que usted desea cambiar la vista de detalles del controlador del maestro

    NewDetailViewController *newDetailVC = ....//Obtain the new detail VC
    
    newDetailVC.navigationItem.leftBarButtonItem = [[[[self.splitViewController.viewControllers objectAtIndex:1]topViewController]navigationItem ]leftBarButtonItem];  //With this you tet a pointer to the button from the first detail VC but from the new detail VC
    
    [[self.navigationController.splitViewController.viewControllers objectAtIndex:1]setViewControllers:[NSArray arrayWithObject:newDetailVC]];  //Now you set the new detail VC as the only VC in the array of VCs of the subclassed navigation controller which is the right VC of the split view Controller

    Esto funciona para mí y que yo pueda evitar la definición de un agujero de protocolo y establecer el maestro como el delegado, que es un gran comercio. Espero que ayude.

    Buena solución, pero se bloquea para mí al intentar girar después de usar este
    ¿Establece el subclases de navegación controlador mediante Programación, IB, o el uso de Guión?
    Mismo problema.. Se estrelló cuando la orientación cambiado.. no estoy utilizando IB o de punta..

    OriginalEl autor Cato

  2. 3

    Si usted todavía necesita:

    http://developer.apple.com/library/ios/#samplecode/MultipleDetailViews/Introduction/Intro.html

    Lo que le hice a mi fuente (tuve configuración similar a usted) para solucionarlo:

    Tengo el master viewcontroller (UITableViewController en mi caso) de ser el delegado de la UISplitViewController. En los dos métodos de delegado para UISplitViewControllers (lo que esta sería su maestro viewcontroller aplicación) que habría de salvar a la popupviewcontroller y la barbuttonitem en su clase. Ahora, si usted cambia de detalles viewcontroller, que debe hacer:

    self.viewControllers = [NSArray arrayWithObjects:[self.viewControllers objectAtIndex:0], newDetailsViewController, nil];
    
    UIViewController <SubstitutableDetailViewController>*vc = (UIViewController <SubstitutableDetailViewController>*)newDetailsViewController;
    
    [vc invalidateRootPopoverButtonItem:_tableViewController.rootPopoverButtonItem];
    [_createReportViewController showRootPopoverButtonItem:_tableViewController.rootPopoverButtonItem];

    donde tenemos

    @protocol SubstitutableDetailViewController
    - (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem;
    - (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem;
    @end

    el delegado de cada uno de los detailsViewControllers debe respetar. Usted podría implementar como este:

    - (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem {
        self.navigationItem.leftBarButtonItem = barButtonItem;
    }
    
    - (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem {
        self.navigationItem.leftBarButtonItem = nil;
    }

    Quisiera saber si esto le ayuda.

    OriginalEl autor Joris Weimar

  3. 2

    Me gustó Nekto la solución, pero se echa de menos un problema clave.

    No está claro qué action: selector hará que el UISplitViewController para mostrar la MasterViewController en una ventana emergente. Cuando finalmente me di cuenta de esto, mediante el examen de la BarButtonItem en el depurador, me di cuenta de por qué era tan difícil de entender esto: la action: selector no está documentado en ninguna parte de Apple iOS SDK. Oops.

    Intente esto:

    UIBarButtonItem *showListView = [[UIBarButtonItem alloc] initWithTitle:@"List" style:UIBarButtonItemStyleBordered target:[self splitViewController] action:@selector(toggleMasterVisible:)];
    [[detailViewController navigationItem] setLeftBarButtonItem:showListView];        

    Puede que desee rodean este código con un condicional que comprueba que la ventana está en modo de retrato, tales como if ([self interfaceOrientation] == UIInterfaceOrientationPortrait)

    Hola Andrés, yo estaba usando su solución «toggleMasterVisible:» y todo estaba funcionando bien, pero cuando he actualizado mi xcode 5, su decir «no declarados selector»…entonces, ¿cómo puedo forzar el botón master a aparecer ahora?

    OriginalEl autor Andrew Ash

  4. 0

    Cuando se establece nuevo punto de vista de los controladores colocado en navigation stack, probablemente, todos los botones de navegación se restablecen. Usted puede agregar manualmente los botones apropiados después de cambiar navigation stack.

    Por ejemplo, usted puede escoger el código de - (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc donde predeterminado de la ventana emergente controlador de botón se crea:

    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Menu" style:UIBarButtonItemStyleBordered target:self action:@selector(appropriateSelector)];
    [self.navigationItem setLeftBarButtonItem:barButtonItem];
    self.popoverController = pc;

    OriginalEl autor Nekto

Dejar respuesta

Please enter your comment!
Please enter your name here