Domanda

Sto usando il modello di vista di divisione per creare un semplice split view che ha, ovviamente, un popover in modalità verticale. Sto usando il codice di default generato da modello che aggiunge / rimuove la voce della barra degli strumenti e imposta il controller popover e lo rimuove. Questi due metodi sono splitViewController: willShowViewController: ... e splitViewController: willHideViewController: ...

Sto cercando di capire come fare il popover scomparire se i rubinetti utente sul tasto della barra degli strumenti durante la visualizzazione del popover. È possibile effettuare la popover sparire senza selezionare un elemento se si tocca ovunque al di fuori del popover, ma vorrei anche per farla sparire se l'utente tocca di nuovo il pulsante.

Dove mi sono bloccato è questo: non sembra essere un modo ovvio, facile da agganciare in azione per il pulsante della barra degli strumenti. Vi posso dire, utilizzando il debugger, che l'azione che viene chiamato il pulsante è showMasterInPopover. E io sono nuovo di lavorare con i selettori di programmazione, lo ammetto.

Posso in qualche modo scrivere un'azione e lo mise sulla voce della barra degli strumenti senza sostituire l'azione che è già lì? per esempio. aggiungere un'azione che chiama quello che è lì adesso? Oppure avrei dovuto scrivere un'azione che mostra / nasconde il popover me (un comportamento che si sta facendo dietro le quinte presumibilmente dal controller vista divisa ora ???).

O mi manca un modo semplice per aggiungere questo comportamento a questo pulsante, senza modificare il comportamento esistente che è in fase di realizzazione per me?

Grazie!

È stato utile?

Soluzione

Così si scopre che è possibile effettuare la popover respingere quando si fa clic sul barButtonItem implementando il metodo SplitViewController willPresentViewController come segue:

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

Altri suggerimenti

Quindi, la barButtonItem avrà l'UISplitViewController come destinazione e showMasterInPopover: come l'azione. Io non riesco a trovarlo nella documentazione, quindi sono un po 'preoccupato non va bene a chiamarlo, ma ho preso a lavorare cambiando l'obiettivo di sé (il controller della vista) e l'azione ad un metodo personalizzato, come in questo modo:

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

non hanno il rappresentante di fare un commento vero e proprio. : - (

@Jann - Sono abbastanza sicuro di quello che Elizabeth vuole fare è piuttosto standard. Per esempio, le note applicazione fornita precaricata sui chiude iPad e apre la popover quando si preme il pulsante della barra degli strumenti in alto a sinistra.

Di seguito è la mia soluzione. Si inizia simile a soluzione greenisus', agganciando gestore di eventi pulsante di barra degli strumenti del UISplitViewController. Io uso una bandiera nel mio controller per monitorare se la popover è aperto o no. Infine, per gestire il caso in cui l'utente apre il popover, poi chiude facendo clic al di fuori del popover, a implementare il protocollo UIPopoverControllerDelegate.

In primo luogo, l'interfaccia di controllo:

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

Io uso _svcAction e _svcTarget a addess greenisus' preoccupazioni che potrebbe non essere chiamando la funzione di destra.

Di seguito è la mia implementazione. Per brevità, ho omesso il codice che crea un'istanza della UISplitViewController ei subviews. è mostrata Tutto il codice mostra / nascondi correlati.

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

Questa è la mia funzione, che risponde al clic di barra pulsante. Questo gestisce il caso in cui i rubinetti degli utenti e ri-tocca il pulsante della barra degli strumenti.

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

Alcune funzioni da 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;
}

Il codice di cui sopra è sufficiente per la maggior parte dei casi. Tuttavia, se l'utente apre il popover, poi congeda cliccando altrove sullo schermo, il booleano _popoverShowing conterrà un valore non corretto, che costringerà l'utente a toccare il pulsante della barra degli strumenti due volte per riaprire il popover. Per risolvere questo problema, implementare il metodo UIPopoverControllerDelegate, come frammento di seguito.

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

Questo mi ha portato sempre di capire, scavando attraverso la documentazione e (credo) la maggior parte delle domande UISplitViewController su StackOverflow. Spero che qualcuno ritiene utile. Se è così, i punti Covet reputazione. ; -)

Forse tutto solo complicare troppo o di aver letto qualcosa di molto diverso da quello che voi ragazzi volevano fare ... ma forse, questo è quello che tutti cercando di capire in modo hardish:

-(void)togglePopOverController {

if ([popOverController isPopoverVisible]) {

[popOverController dismissPopoverAnimated:YES];

} else {

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

}

}

Elisabeth scrive:

  

È possibile effettuare il popover sparire senza selezionare un elemento se si tocca ovunque al di fuori del popover, ma vorrei anche per farla sparire se l'utente tocca di nuovo il pulsante.

Prima di tutto, lasciatemi dire che nessuno di quello che sto per dire è da prendere personalmente - non è inteso in questo modo. Tutto deriva da anni di progettazione di interfacce di programmazione e studiando le Human Interface Guidelines di Apple (oltre ad avere un grafico che è contstantly cerca per insegnarmi il modo giusto di fare le cose). Essa è considerata come un punto di vista opposto e non come un rant.

Quello che stai suggerendo è un problema UI-saggio per me, e sarà un problema che causa problemi quando Apple cliente l'applicazione. Non si è mai suppone di avere un noto UI-oggetto svolgere una funzione che non esegue normalmente (ad esempio: un pulsante mai mostra e quindi rilascia una vista / oggetto / finestra. Attiva farlo).

Per esempio, una lente d'ingrandimento sui mezzi navbar ricerca (come definito da Apple). Essi hanno in passato, e continuerà in futuro a, rifiutano le applicazioni che utilizzano questo per lo zoom l'interfaccia. Ad esempio: di Apple Rejects Convertbot o l'odissea: Trail of Tears (ricerca del pagina per esso). La lingua del rifiuto è sempre lo stesso (in grassetto marcatura cosa avrebbero citare per il vostro uso):

  

“... usa le immagini dello schermo di iPhone / iPod standard, in modo non standard, potenzialmente con conseguente confusione dell'utente. Cambiare il comportamento di grafica standard di iPhone, Azioni , e le immagini, o la simulazione fallimenti di quelle grafiche, azioni, o immagini è una violazione del iPhone Developer Accordo di programma che richiede applicazioni di rispettare le Human Interface Guidelines “.

Inoltre, se si vuole veramente questa funzione, chiedetevi: "Perché?". Se è perché voi, voi stessi, come se fosse, allora mi sarebbe davvero saltare. La maggior parte degli utenti sarebbero confusi da questo comportamento e non sarebbe in realtà usarlo perché non saprebbero che fosse la possibilità di utilizzare . Apple ha passato gli ultimi 3 anni di formazione degli utenti iPhoneOS come utilizzare i loro elementi del sistema operativo e di interfaccia. L'ultima cosa che, come programmatore o designer, vuoi fare è trascorrere del tempo cercando di addestrare un utente su come utilizzare la vostra applicazione. Essi generalmente rimuovere l'applicazione dal proprio dispositivo e passare a un'altra applicazione simile, invece di costringere se stessi per imparare tuo modo di fare le cose.

Just my $ .02

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top