ipad - einen UIPopoverController ablehnen

8

Ich habe eine Schaltfläche im Inhalt eines UIPopoverControllers. Diese Schaltfläche führt eine Methode namens myAction aus.

MyAction hat die Form

%Vor%

Also, myAction empfängt die ID der Anrufer-Schaltfläche.

Nun, innerhalb dieser Methode möchte ich den UIPopoverController ablehnen, aber das einzige, was ich habe, ist die ID der Anrufer-Taste. Denken Sie daran, dass sich die Schaltfläche im UIPopoverController befindet.

Gibt es eine Möglichkeit, die ID des UIPopoverControllers aufgrund der bereits vorhandenen Schaltflächen-ID zu ermitteln?

danke.

    
SpaceDog 13.04.2010, 14:25
quelle

4 Antworten

19

Leider nicht. Zumindest nicht innerhalb der Standard-Praktiken. Du könntest vielleicht den Responderstapel aufsuchen, um ihn zu finden, aber es ist ein Hack, es ist fehlerhaft und es ist wirklich, wirklich chaotisch.

Wenn Sie ein Popover durch Drücken einer Schaltfläche verwerfen möchten, sollten einige relevante Orte einen Verweis auf das Popover behalten. Normalerweise wäre das der Besitzer des Popover ( nicht der Controller zeigte innerhalb des Popover). Wenn der Knopf gedrückt wird, kann er eine Nachricht an den Besitzer-Controller senden, der dann das Popover abweisen kann.

Sie könnten versucht sein, dass der Controller im Popover angezeigt wird, der Eigentümer des eigenen Popover ist, aber die Codierung ist brüchig, kann (wieder) unordentlich werden und kann zu Retain-Schleifen führen, so dass sie nie wieder freigegeben werden .

    
Ed Marty 13.04.2010, 14:32
quelle
5

Sie können auf den presenting popoverController zugreifen, indem Sie mit KVC auf "popoverController" zugreifen.

%Vor%     
JasonMing 23.08.2012 07:56
quelle
4

Ich habe das funktioniert, und ich denke nicht, dass es ein Hack ist. Ich habe eine Standard-Split-View-iPad-App. Ich habe dann eine Methode auf meinem Detail-Controller (der Besitzer des Pop-over) hinzugefügt, um die Entlassung zu behandeln.

In der Standard-Split-View-Architektur sind sowohl der Root- als auch der Detailansicht-Controller über den App-Delegaten verfügbar. Also habe ich einen Knopfklick innerhalb des Pop-Over gebunden, um eine Methode aufzurufen, die den App-Delegaten ruft. Von dort rufe ich die Methode auf dem Detail-Controller auf, um den Pop-Over zu verwerfen.

Dies ist der Code für die Methode auf dem View-Controller, der im Popover angezeigt wird:

%Vor%

Dann die einfache Methode, um auf dem Detailansicht Controller zu entlassen:

%Vor%

Ich mag die Fähigkeit, dies zu tun, weil es mir eine Möglichkeit gibt, einem Benutzer zu zeigen, wie er einen Pop-Over beenden kann. Dies ist möglicherweise in zukünftigen Versionen der App nicht erforderlich. Im Moment, während dieses Paradigma noch neu für die Plattform ist, bevorzuge ich es, die Benutzer eine Anzeige in ein paar verschiedenen Möglichkeiten gexit lassen, um sicherzustellen, dass ich Frustration minimieren.

    
MystikSpiral 23.04.2010 17:13
quelle
0

Wie schon Ed Marty geschrieben hat

  

Wenn Sie ein Popover durch Drücken einer Schaltfläche verwerfen möchten, sollten einige relevante Orte einen Verweis auf das Popover behalten

Das ist sehr wahr; Wenn jedoch ein UIPopoverController angezeigt wird, behält die Klasse, die den Popovercontroller öffnet, diese Ressource bereits bei. Sie könnten also diese Klasse als Delegate-Klasse für Ihren Popover-Controller verwenden.

Dazu können Sie Folgendes tun, was ich in meinem Code verwende. In der Klasse, die das Popover öffnet, ist dies mein Code:

%Vor%

Also, was ich hier mache, ist ein UINavigationController zu erstellen und ein BookingDetailsViewController als rootViewController zu setzen. Dann füge ich auch die aktuelle Klasse als Delegat zu diesem BookingDetailsViewController hinzu.

Die zweite Sache, die ich hinzugefügt habe, ist eine Entlassungsmethode namens dismissPopoverAnimated:animated .

In meinem BookingDetailsViewController.h habe ich den folgenden Code hinzugefügt:

%Vor%

Und in meinem BookingDetailsViewController.m habe ich diesen Code hinzugefügt:

%Vor%

Wenn die Schaltfläche "Schließen" im UINavigationController gedrückt wird, wird die Methode closeView aufgerufen. Diese Methode überprüft, ob der Delegat auf dismissPopoverAnimated:animated reagiert und ruft sie dann auf. Wenn es nicht auf diese Methode reagiert, zeigt es eine Protokollmeldung an und tut nichts mehr (so wird es nicht abstürzen).

Ich habe meinen Code mit ARC geschrieben, daher gibt es keine Speicherverwaltung.

Ich hoffe, das hat dir geholfen.

    
Paul Peelen 30.10.2012 09:45
quelle

Tags und Links