Pregunta

Estoy utilizando la plantilla de vista dividida para crear una vista dividida simple que tiene, por supuesto, un popover en modo vertical. Estoy utilizando el código predeterminado generado por la plantilla que agrega / quita el elemento barra de herramientas y establece el controlador popover y lo elimina. Estos dos métodos son splitViewController: willShowViewController: ... y splitViewController: willHideViewController: ...

Estoy tratando de encontrar la manera de hacer que el popover desaparecer si los grifos de usuario en el botón de la barra mientras se visualiza el popover. Puede hacer que el popover desaparecer sin seleccionar un elemento si pulsa en cualquier lugar fuera del popover, pero también me gustaría hacerlo desaparecer si el usuario pulsa el botón de nuevo.

¿Dónde estoy atascado es la siguiente: no parece ser una manera obvia, fácil de conectar a la acción para el botón de la barra de herramientas. Les puedo decir, utilizando el depurador, que la acción que está siendo llamado en el botón es showMasterInPopover. Y estoy acostumbrado a trabajar con los selectores de programación, lo reconozco.

¿Hay algún modo escribir una acción y la puso sobre el elemento de la barra de herramientas y sin anular la acción que ya existe? p.ej. añadir una acción que llama a la que está ahí ahora? O tendría que escribir una acción que muestra / esconde el mismo popover (comportamiento que se está haciendo detrás de las escenas, presumiblemente por el controlador de vista dividida ahora ???).

O me estoy perdiendo una manera fácil de agregar este comportamiento a este botón sin cambiar el comportamiento existente que está siendo preparado para mí?

Gracias!

¿Fue útil?

Solución

Así que resulta que se puede hacer que el popover despedir al pulsar sobre el barButtonItem mediante la aplicación del método se SplitViewController PresentViewController de la siguiente manera:

- (void) splitViewController:(UISplitViewController *)svc 
           popoverController: (UIPopoverController *)pc
   willPresentViewController: (UIViewController *)aViewController
{
    if (pc != nil) {
        [pc dismissPopoverAnimated:YES];
    }
}

Otros consejos

Por lo tanto, la barButtonItem tendrá la UISplitViewController como el objetivo y showMasterInPopover: como la acción. No puedo encontrarla en la documentación, así que estoy un poco preocupado de que no está bien llamarlo, pero yo tengo que trabajar por el cambio de blanco a uno mismo (el controlador de vista) y la acción a un método personalizado, al igual esto:

- (void)showMasterInPopover:(id)sender {
    // ...insert custom stuff here...
    [splitViewController showMasterInPopover:sender];
}

no tiene el representante para hacer un comentario real. : - (

@Jann - Estoy bastante seguro de lo que Elizabeth quiere hacer es bastante estándar. Por ejemplo, la aplicación de Notas que se suministra precargado en los protectores y cierra y abre el popover cuando se pulsa el botón de la barra en la esquina superior izquierda.

A continuación se muestra mi solución. Comienza similar a la solución de greenisus', enganchando botón de la barra controlador de eventos del UISplitViewController. Yo uso una bandera en mi controlador para realizar un seguimiento de si el popover está abierta o no. Por último, para manejar el caso en que el usuario abre el popover, luego se cierra haciendo clic fuera del popover, que implementan el protocolo UIPopoverControllerDelegate.

En primer lugar, la interfaz del controlador:

@interface LaunchScene : NSObject <UISplitViewControllerDelegate, UIPopoverControllerDelegate>
{
    UISplitViewController* _splitViewController;    //Shows list UITableView on the left, and details on the right
    UIToolbar* _toolbar;                            //Toolbar for the button that will show the popover, when in portrait orientation
    SEL _svcAction;                                 //The action from the toolbar
    id _svcTarget;                                  //The target object from the toolbar
    UIPopoverController* _popover;                  //The popover that might need to be dismissed
    BOOL _popoverShowing;                           //Whether the popover is currently showing or not
}

-(void) svcToolbarClicked: (id)sender;

Yo uso _svcAction y _svcTarget a greenisus addess preocupaciones que no se podría llamar a la función correcta.

A continuación es mi aplicación. Por razones de brevedad, he omitido el código que crea una instancia del UISplitViewController y los subvistas. se muestra Todo el código de mostrar / ocultar relacionados.

//the master view controller will be hidden so hook the popover
- (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:(UIPopoverController*)pc 
{   
    _popoverShowing = FALSE;
    if(_toolbar == nil) 
    {
        //set title of master button
        barButtonItem.title = @"Title goes here";

        //Impose my selector in between the SVController, and the SVController's default implementation
        _svcTarget = barButtonItem.target;
        _svcAction = barButtonItem.action;
        barButtonItem.target = self;
        barButtonItem.action = @selector(svcToolbarClicked:);

        //create a toolbar
        _toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 1024, 44)];
        [_toolbar setItems:[NSArray arrayWithObject:barButtonItem] animated:YES];
    }

    //add the toolbar to the details view (the second controller in the splitViewControllers array)
    UIViewController* temp = [_splitViewController.viewControllers objectAtIndex:1];
    [temp.view addSubview:_toolbar];
}

Esta es mi función, que responde a la barra de herramientas, haga clic en. Este Trata el caso en los grifos de usuario y re-golpea el botón de la barra de herramientas.

-(void) svcToolbarClicked: (id)sender
{
    if(_popoverShowing)
    {
        [_popover dismissPopoverAnimated:TRUE];
    }
    else 
    {
        //Perform the default SVController implementation
        [_svcTarget performSelector:_svcAction];
    }
    //Toggle the flag
    _popoverShowing = !_popoverShowing;
}

Algunas funciones de UISplitViewControllerDelegate

//the master view (non-popover) will be shown again (meaning it is going to landscape orientation)
- (void)splitViewController:(UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)button 
{
    //remove the toolbar
    [_toolbar removeFromSuperview];
}

// the master view controller will be displayed in a popover (i.e. the button has been pressed, and the popover is about to be displayed.  
//Unfortunately triggers when the popover is ALREADY displayed.
- (void)splitViewController:(UISplitViewController*)svc popoverController:(UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController 
{   
    _popover = pc; //Grab the popover object  
    _popover.delegate = self;
}

El código anterior es suficiente para la mayoría de los casos. Sin embargo, si el usuario abre el popover, entonces descarta haciendo clic en otra parte de la pantalla, el booleano _popoverShowing contendrá un valor incorrecto, lo que obligará al usuario que pulse el botón de la barra dos veces para volver a abrir el popover. Para solucionar este problema, aplicar el método UIPopoverControllerDelegate, al igual que el fragmento a continuación.

//UIPopoverControllerDelegate method
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    _popoverShowing = FALSE;
    _popover = nil;
}

Esto me llevó siglos para averiguar, cavando a través de los documentos y (creo) la mayor parte de las preguntas UISplitViewController en StackOverflow. Espero que alguien le resulta útil. Si es así, puntos de reputación codiciar I. ; -)

Tal vez todo sólo complican demasiado o que haya leído algo muy diferente de lo que ustedes querían hacer ... pero tal vez, esto es lo que todos estamos tratando de averiguar lo que hardish:

-(void)togglePopOverController {

if ([popOverController isPopoverVisible]) {

[popOverController dismissPopoverAnimated:YES];

} else {

[popOverController presentPopoverFromBarButtonItem:bbiOpenPopOver permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

}

}

Elisabeth escribe:

  

Se puede hacer que el popover desaparecer sin seleccionar un elemento si pulsa en cualquier lugar fuera del popover, pero también me gustaría hacerlo desaparecer si el usuario pulsa el botón de nuevo.

En primer lugar, permítanme decir que nada de lo que voy a decir es que tomar personalmente - no se pretende de ese modo. Todo viene de años de diseño de interfaces de programación y el estudio de las Human Interface Guidelines de Apple (además de tener un diseñador gráfico que es contstantly tratando que me enseñe la forma correcta de hacer las cosas). Se entiende como un punto de vista opuesto y no como una queja.

Lo que está sugiriendo es un problema de interfaz de usuario en cuanto a mí, y será un problema que provoca problemas cuando Apple revisa la aplicación. Nunca se supone que tienen una interfaz de usuario-objeto conocido realizar una función que no funciona normalmente (Por ejemplo: un botón nunca muestra y luego libera una vista / objeto / ventana. Alterna hacer esto).

Por ejemplo, una lupa en los medios navbar de búsqueda (como se define por Apple). Tienen en el pasado, y continuarán en el futuro, se niegan aplicaciones que utilizan esto para el zoom de la interfaz. Por ejemplo: Apple rechaza Convertbot o la Odisea: Camino de las lágrimas (buscar en la página para ello). El idioma en el rechazo es siempre el mismo (en negrita marcando lo que iban a citar para su uso):

  

“... utiliza imágenes de pantalla estándar iPhone / iPod en una forma no estándar, que podrían resultar en confusión del usuario. Cambiar el comportamiento de gráficos estándar de iPhone, acciones , y las imágenes, o la simulación de fallos de esos gráficos, acciones o imágenes es una violación del acuerdo de iPhone Developer Program que requiere aplicaciones de cumplir con las directrices de interfaz humana .”

Además, si realmente quiere esta característica, pregúntese: "¿Por qué?". Si es porque usted, usted mismo, al igual que ella, entonces yo realmente lo salta. La mayoría de los usuarios podrían ser confundidos por este comportamiento y no realmente lo usa porque no sabrían que era una opción para el uso . Apple gastó los últimos 3 años la formación de los usuarios iPhoneOS modo de utilizar estos elementos del sistema operativo y de interfaz. Lo último que, como programador o diseñador, quiero hacer es pasar tiempo tratando de entrenar a un usuario sobre el uso de la aplicación. Por lo general, eliminar la aplicación de su dispositivo y traslado a otra aplicación similar en lugar de forzar a sí mismos para aprender forma de hacer las cosas.

Sólo mi $ .02

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