Für meine Anwendung müssen folgende Elemente in einem Aktionsblatt hinzugefügt werden.
- UIToolbar
- Schaltfläche auf der UIToolbar
- UIPicker-Steuerung
Ich habe ein Bild beigefügt, um meine Anforderungen zu verstehen.
Könnten Sie bitte erklären, wie dies umgesetzt werden kann?
ios
iphone
uipickerview
actionsheetpicker
Sagar R. Kothari
quelle
quelle
Antworten:
Update für iOS 7
Apple-Dokumente für UIActionSheet :
UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy
Ich empfehle, nicht zu versuchen, den Inhalt eines ActionSheets anzupassen, da dies in iOS 7 zu schwerwiegenden ungültigen Kontextfehlern führen kann. Ich habe nur ein paar Stunden damit verbracht, dieses Problem zu lösen, und mich letztendlich für einen anderen Ansatz entschieden. Ich habe den Aufruf zum Anzeigen des Aktionsblatts durch einen Modal View Controller ersetzt, der eine einfache Tabellenansicht enthält.
Es gibt viele Möglichkeiten, dies zu erreichen. Hier ist eine Möglichkeit, die ich gerade in einem aktuellen Projekt implementiert habe. Es ist schön, weil ich es zwischen 5 oder 6 verschiedenen Bildschirmen wiederverwenden kann, auf denen ich alle Benutzer aus einer Liste von Optionen auswählen kann.
SimpleTableViewController
.SimpleTableViewControllerDelegate
mit einer erforderlichen MethodeitemSelectedatRow:
und einer schwachen Eigenschaft namens delegate of typeid<SimpleTableViewControllerDelegate>
. Auf diese Weise geben wir die Auswahl an den übergeordneten Controller zurück.itemSelectedatRow:
intableView:didSelectRowAtIndexPath:
.Dieser Ansatz hat den zusätzlichen Vorteil, dass er ziemlich wiederverwendbar ist. Importieren Sie zur Verwendung die SimpleTableViewController-Klasse in Ihre ViewController.h, passen Sie sie an SimpleTableViewDelegate an und implementieren Sie die
itemSelectedAtRow:
Methode. Um das Modal zu öffnen, instanziieren Sie einfach einen neuen SimpleTableViewController, legen Sie die Tabellendaten fest, delegieren Sie sie und präsentieren Sie sie.Ich erstelle ein einfaches Beispiel und habe es auf github gepostet .
Siehe auch Anzeigen des Aktionsblatts verursacht ungültige CGContext-Kontextfehler .
quelle
Noch eine Lösung:
Keine Symbolleiste, sondern ein segmentiertes Steuerelement (Eyecandy)
quelle
Obwohl diese Frage alt ist, werde ich schnell erwähnen, dass ich eine ActionSheetPicker-Klasse mit einer praktischen Funktion zusammengestellt habe, sodass Sie ein ActionSheet mit einer UIPickerView in einer Zeile erzeugen können. Es basiert auf Code aus Antworten auf diese Frage.
Bearbeiten: Es wird jetzt auch die Verwendung eines DatePickers und eines DistancePickers unterstützt.
UPD:
Diese Version ist veraltet: Verwenden Sie stattdessen ActionSheetPicker-3.0 .
quelle
ActionSheetDatePicker
Modus können Sie der Symbolleiste oben mehrere Schaltflächen hinzufügen. Ist das auch mit normal möglichActionSheetStringPicker
?Ja! Ich finde es endlich.
Implementieren Sie den folgenden Code in Ihr Schaltflächenklickereignis, um das im Bild der Frage angegebene Aktionsblatt aufzurufen.
quelle
Marcios hervorragende Lösung für diese Frage hat mir sehr geholfen, einem UIActionSheet Unteransichten jeglicher Art hinzuzufügen.
Aus Gründen, die mir (noch) nicht ganz klar sind, können die Grenzen des UIActionSheets erst festgelegt werden, nachdem es angezeigt wurde. beide Sagar ist und marcio Lösungen erfolgreich diese Adresse mit einem setBounds: CGRectMake (...) Nachricht an den actionsheet gesendet werden , nachdem es gezeigt wird.
Wenn Sie jedoch die UIActionSheet-Grenzen festlegen, nachdem das Blatt angezeigt wurde, wird ein sprunghafter Übergang erstellt, wenn das ActionSheet angezeigt wird, in dem es "angezeigt" wird und dann nur über die letzten 40 Pixel oder so gescrollt wird.
Wenn Sie die Größe einer UIPickerView nach dem Hinzufügen von Unteransichten ändern, empfehle ich, die an das actionSheet gesendete setBounds-Nachricht in einen Animationsblock zu packen. Dadurch wird der Eingang des Aktionsblatts flüssiger.
quelle
Für diejenigen, die versuchen, die DatePickerDoneClick-Funktion zu finden ... hier ist der einfache Code zum Schließen des Aktionsblatts. Offensichtlich sollte aac ein ivar sein (derjenige, der in Ihrer .h-Datei für die Implementierung enthalten ist)
quelle
Ich verstehe nicht wirklich, warum das
UIPickerView
in einem gehtUIActionSheet
. Dies scheint eine chaotische und hackige Lösung zu sein, die in einer zukünftigen iOS-Version beschädigt werden kann. (Ich hatteUIPickerView
solche Dinge schon einmal in einer App, in der das beim ersten Tippen nicht präsentiert wurde und erneut getippt werden musste - seltsame Macken mit demUIActionSheet
).Ich habe einfach ein implementiert
UIPickerView
und es dann als Unteransicht zu meiner Ansicht hinzugefügt und es nach oben animiert, als würde es wie ein Aktionsblatt dargestellt.quelle
Um die fantastische Lösung von marcio zu erweitern,
dismissActionSheet:
kann sie wie folgt implementiert werden.Fügen Sie diese Methode Ihrem Code hinzu.
quelle
Ich denke, das ist der beste Weg, es zu tun.
ActionSheetPicker-3.0
Es ist so ziemlich das, was jeder vorschlägt, aber es werden Blöcke verwendet, was eine nette Geste ist!
quelle
Seit iOS 8 können Sie nicht, es funktioniert nicht, weil Apple die interne Implementierung von geändert hat
UIActionSheet
. Weitere Informationen finden Sie in der Apple-Dokumentation :quelle
Ich mochte den Ansatz von Wayfarer und flexaddicted, fand aber (wie aZtral), dass er nicht funktionierte, da der backgroundTapButton das einzige Element war, das auf Benutzerinteraktion reagierte. Dies führte mich dazu, alle drei seiner Unteransichten: _picker, _pickerToolbar und backgroundTapButton in eine enthaltende Ansicht (Popup) zu setzen, die dann auf und neben dem Bildschirm animiert wurde. Ich brauchte auch eine Schaltfläche Abbrechen in der _pickerToolbar. Hier sind die relevanten Codeelemente für die Popup-Ansicht (Sie müssen Ihre eigene Picker-Datenquelle angeben und Methoden delegieren).
quelle