Frage

Ich bin mit der geteilten Ansicht Vorlage eine einfache Split-Ansicht zu erstellen, die, natürlich hat eine popover in Portrait-Modus. Ich verwende den Code Standard durch Vorlage erzeugt, die über die Toolbar fügt / entfernt und setzt den popover Controller und entfernt sie. Diese beiden Methoden sind splitViewController: willShowViewController: ... und splitViewController: willHideViewController: ...

Ich versuche, herauszufinden, wie die popover verschwinden zu lassen, wenn die Benutzer Hähne auf der Symbolleiste auf der Schaltfläche während des popover angezeigt wird. Sie können die verschwinden popover ohne ein Element auswählen, wenn Sie irgendwo außerhalb des popover tippen, aber ich möchte auch, um es verschwinden, wenn der Benutzer erneut auf die Schaltfläche tippt.

Wo ich bin stecken, ist dies: es scheint nicht eine offensichtliche, einfache Art und Weise zu sein, in der Aktion für die Symbolleiste auf die Schaltfläche einzuhaken. Ich kann sagen, die Debugger verwenden, dass die Aktion, die auf der Schaltfläche showMasterInPopover ist genannt wird. Und ich bin mit Selektoren programmatisch zu arbeiten, gebe ich zu.

Kann ich irgendwie eine Aktion schreiben und es auf der Symbolleiste Element gesetzt, ohne dass die Aktion überschreiben, die bereits da? z.B. eine Aktion hinzufügen, die man aufruft, die es jetzt ist? Oder hätte ich eine Aktion, die zeigt / versteckt das popover ich (Verhalten, das jetzt hinter den Kulissen vermutlich durch den Split-View-Controller getan wird ???) zu schreiben.

Oder bin ich eine einfache Möglichkeit, fehlt dieses Verhalten auf diese Schaltfläche hinzufügen, ohne das vorhandene Verhalten zu ändern, die für mich eingerichtet wird?

Danke!

War es hilfreich?

Lösung

So stellt sich heraus, dass Sie die popover entlassen machen können, wenn sie auf dem barButtonItem Klick durch die SplitViewController Umsetzung wird PresentViewController Methode wie folgt:

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

Andere Tipps

die barButtonItem wird also haben die UISplitViewController als Ziel und showMasterInPopover: als Aktion. Ich kann es nicht in der Dokumentation, so dass ich ein bisschen bin besorgt, dass es nicht in Ordnung ist, es zu nennen, aber ich habe es an der Arbeit durch das Ziel selbst zu ändern (die View-Controller) und die Aktion auf eine benutzerdefinierte Methode, wie folgt aus:

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

Haben die rep keine wirkliche Bemerkung zu machen. : - (

@Jann - Ich bin mir ziemlich sicher, was Elizabeth tun will, ist ziemlich Standard. Zum Beispiel können die Notes-Anwendung, dass die Schiffe vorinstalliert auf dem iPad schließt und öffnet die popover, wenn Sie die Symbolleiste auf die Schaltfläche in der linken oberen Ecke drücken.

Im Folgenden finden Sie meine Lösung. Es beginnt ähnlich wie greenisus' Lösung, von der Symbolleiste auf die Schaltfläche Ereignishandler UISplitViewController Einhaken. Ich benutze eine Flagge in meinem Controller zu verfolgen, ob der popover offen ist oder nicht. Schließlich, den Fall zu behandeln, in denen der Benutzer die popover öffnet, dann schließt sie von außerhalb des popover klicken, ich das UIPopoverControllerDelegate Protokoll implementieren.

Zuerst wird die Controller-Schnittstelle:

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

verwende ich _svcAction und _svcTarget zu addess greenisus die Sorgen, dass er nicht die richtige Funktion aufgerufen werden kann.

Im Folgenden finden Sie meine Implementierung. Der Kürze halber habe ich den Code verzichtet, der die UISplitViewController und die Subviews instanziiert. Alle anzeigen / ausblenden bezogenen Code angezeigt wird.

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

Hier ist meine Funktion, dass reagiert auf die Symbolleiste klicken. Diese Griffe der Fall, wenn der Benutzer Hähnen und die Symbolleiste auf die Schaltfläche Wieder tippt.

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

Einige Funktionen von 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;
}

Der obige Code ist für die meisten Fälle ausreichend. Wenn jedoch der Benutzer die popover öffnet, dann entlässt durch an anderer Stelle auf dem Bildschirm klicken, wird der _popoverShowing boolean wird einen falschen Wert enthält, der den Benutzer dazu zwingt, die Symbolleiste Taste zweimal, um wieder zu öffnen, die popover zu erschließen. Um dies zu beheben, implementieren die UIPopoverControllerDelegate Methode, wie die folgenden Code-Schnipsel.

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

Das hat mich für immer, um herauszufinden, Graben durch die Dokumentation und (glaube ich) die meisten der UISplitViewController Fragen auf Stackoverflow. Ich hoffe, dass jemand es nützlich findet. Wenn ja, ich begehren Rufpunkte. ; -)

Vielleicht komplizieren Sie alle es einfach zu viel oder ich habe etwas ganz anderes liest als ihr tun wollten ... aber vielleicht, das ist, was man alles so hardish um herauszufinden versucht:

-(void)togglePopOverController {

if ([popOverController isPopoverVisible]) {

[popOverController dismissPopoverAnimated:YES];

} else {

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

}

}

Elisabeth schreibt:

  

Sie können die popover ohne Auswahl eines Elements verschwinden, wenn Sie eine beliebige Stelle außerhalb des popover tippen, aber ich möchte auch, um es verschwinden, wenn der Benutzer erneut auf die Schaltfläche tippt.

Zunächst einmal möchte ich sagen, dass keiner von dem, was ich jetzt sagen würde persönlich genommen werden - es nicht so gemeint ist. Es kommt alles von den Jahren der Programmierschnittstelle der Gestaltung und das Apple Human Interface Guidelines studiert (sowie mit einem Grafik-Designern, die contstantly ist Versuch mir den richtigen Weg zu lehren, Dinge zu tun). Es wird als Gegen Gesichtspunkt und nicht als rant.

Was Sie vorschlagen, ist ein Problem UI-weise für mich, und wird ein Thema sein, die Probleme verursacht, wenn Apple die App-Bewertungen. eine Schaltfläche nie zeigt und dann löst einen Blick / Objekt: Sie werden nie ein bekanntes-UI-Objekt eine Funktion auszuführen, dass es nicht normal durchführt (zum Beispiel haben sollen / Fenster. Schaltet tun dies).

Zum Beispiel kann eine Lupe auf dem navbar Mittel Suche (wie von Apple definiert). Sie haben in der Vergangenheit und in der Zukunft Genüge zu tun, Apps weiterhin, die diese verwenden, um die Schnittstelle Zoomen. Zum Beispiel: The Odyssey: Trail of Tears (Suche der Seite für sie). Die Sprache, in der Ablehnung ist immer das gleiche (fett markiert, was sie würden für Ihre Nutzung zitieren):

  

„... verwendet Standard-iPhone / iPod-Bildschirm Bilder in einer Nicht-Standard-Art und Weise, die möglicherweise in Benutzern Verwirrung führt. Ändern das Verhalten von Standard-iPhone Grafiken, Aktionen , und Bilder oder Ausfälle solcher Grafiken, Aktionen zu simulieren, oder Bilder ist eine Verletzung der iPhone Developer Program Vereinbarung, welche Anwendungen von dem Human Interface Guidelines zu halten erfordert .“

Auch wenn Sie wirklich diese Funktion wünschen, fragen Sie sich: „Warum?“. Wenn es ist, weil Sie selbst, wie es, dann würde ich es wirklich überspringen. Die meisten Nutzer würden durch dieses Verhalten verwechselt werden und würde es nicht wirklich verwenden, da sie wäre es eine Option, um die Verwendung nicht weiß, ist . Apple verbrachte die letzten 3 Jahre iPhoneOS Benutzer trainiert, wie sie ihre OS und Interface-Elemente zu verwenden. Das letzte, was Sie, als Programmierer oder Designer, tun möchte, ist zu verbringen Zeit versucht, einen Benutzer zu trainieren, wie Sie Ihre App nutzen. Sie werden Ihre App von ihrem Gerät und Umzug in eine andere ähnliche App im Allgemeinen entfernen, anstatt sich zu zwingen, zu lernen, Ihre Art und Weise, Dinge zu tun.

Just my $ .02

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top