Moja aplikacja wymaga dodania następujących elementów w arkuszu działań.
- UIToolbar
- Przycisk na UIToolbar
- Kontrola UIPicker
Dołączam obraz, aby zrozumieć moje wymagania.
Czy mógłbyś wyjaśnić, jak można to wdrożyć?
ios
iphone
uipickerview
actionsheetpicker
Sagar R. Kothari
źródło
źródło
Odpowiedzi:
Aktualizacja dla iOS 7
Dokumentacja Apple dla UIActionSheet :
UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy
Odradzam dostosowywanie zawartości ActionSheet, ponieważ może to prowadzić do poważnych błędów nieprawidłowego kontekstu w iOS 7. Właśnie spędziłem kilka godzin na pracy nad tym problemem i ostatecznie zdecydowałem się na inne podejście. Zastąpiłem wywołanie pokazania arkusza akcji kontrolerem widoku modalnego zawierającym prosty widok tabeli.
Można to osiągnąć na wiele sposobów. Oto jeden sposób, który właśnie wdrożyłem w bieżącym projekcie. To fajne, ponieważ mogę go ponownie użyć między 5 lub 6 różnymi ekranami, na których wszyscy użytkownicy wybierają z listy opcji.
SimpleTableViewController
.SimpleTableViewControllerDelegate
z wymaganą metodąitemSelectedatRow:
i słabą właściwością o nazwie delegat typuid<SimpleTableViewControllerDelegate>
. W ten sposób przekażemy wybór z powrotem do kontrolera nadrzędnego.itemSelectedatRow:
wtableView:didSelectRowAtIndexPath:
.Takie podejście ma dodatkową zaletę w postaci możliwości ponownego wykorzystania. Aby użyć, zaimportuj klasę SimpleTableViewController w swoim ViewController.h, dostosuj się do SimpleTableViewDelegate i zaimplementuj
itemSelectedAtRow:
metodę. Następnie, aby otworzyć modal, po prostu utwórz wystąpienie nowego SimpleTableViewController, ustaw dane tabeli i delegata, a następnie przedstaw je.Tworzę prosty przykład i umieściłem go na githubie .
Zobacz także Wyświetlanie arkusza działań powoduje błędy w nieprawidłowym kontekście CGContext .
źródło
Jeszcze jedno rozwiązanie:
bez paska narzędzi, ale podzielona na segmenty kontrolka (oko)
źródło
Chociaż to pytanie jest stare, szybko wspomnę, że utworzyłem razem klasę ActionSheetPicker z wygodną funkcją, dzięki czemu możesz odrodzić ActionSheet z UIPickerView w jednej linii. Opiera się na kodzie z odpowiedzi na to pytanie.
Edycja: teraz obsługuje również użycie DatePicker i DistancePicker.
UPD:
Ta wersja jest przestarzała: zamiast tego użyj ActionSheetPicker-3.0 .
źródło
ActionSheetDatePicker
trybie możesz dodać wiele przycisków do paska narzędzi u góry. Czy jest to możliwe również z po prostu normalnymActionSheetStringPicker
?Tak ! W końcu to znalazłem.
zaimplementuj następujący kod na zdarzeniu kliknięcia przycisku, aby wyświetlić arkusz akcji, jak podano na obrazku pytania.
źródło
Doskonałe rozwiązanie Marcio na to pytanie bardzo mi pomogło w dodawaniu podglądów podrzędnych do arkusza UIActionSheet.
Z powodów, które nie są (jeszcze) całkowicie dla mnie jasne, granice arkusza UIActionSheet można ustawić dopiero po jego wyświetleniu; zarówno sagar, jak i marcio rozwiązują ten problem, wysyłając do arkusza akcji komunikat setBounds: CGRectMake (...) po jego wyświetleniu.
Jednak ustawienie granic UIActionSheet po wyświetleniu arkusza tworzy gwałtowne przejście, gdy arkusz ActionSheet pojawia się, gdzie pojawia się w widoku, a następnie przewija się tylko przez ostatnie 40 pikseli lub więcej.
Podczas określania rozmiaru UIPickerView po dodaniu podglądów podrzędnych, zalecam zawijanie wiadomości setBounds wysyłanej do actionSheet wewnątrz bloku animacji. Dzięki temu wejście actionSheet będzie wyglądać płynniej.
źródło
Dla tych facetów, którzy szukają funkcji DatePickerDoneClick ... oto prosty kod, aby zamknąć Arkusz działań. Oczywiście aac powinien być ivar (tym, który znajduje się w twoim pliku implmentacji .h)
źródło
Naprawdę nie rozumiem, dlaczego
UIPickerView
dzieje się wewnątrz plikuUIActionSheet
. Wydaje się, że jest to niechlujne i hakerskie rozwiązanie, które może zostać zepsute w przyszłej wersji iOS. (Miałem już takie rzeczy jak ta przerwa w aplikacji, w którejUIPickerView
nie były wyświetlane przy pierwszym dotknięciu i musiały zostać ponownie zmapowane - dziwne dziwactwa zUIActionSheet
).To, co zrobiłem, to po prostu zaimplementowałem a,
UIPickerView
a następnie dodałem go jako podwidok do mojego widoku i ożywiłem go tak, jakby był prezentowany jak arkusz akcji.źródło
Aby dodać do niesamowitego rozwiązania marcio,
dismissActionSheet:
można je zaimplementować w następujący sposób.Dodaj tę metodę do swojego kodu.
źródło
Myślę, że to najlepszy sposób na zrobienie tego.
ActionSheetPicker-3.0
To prawie to, co wszyscy sugerują, ale używa klocków, co jest miłym akcentem!
źródło
Od iOS 8 nie możesz, to nie działa, ponieważ Apple zmieniło wewnętrzną implementację
UIActionSheet
. Zapoznaj się z dokumentacją Apple :źródło
Podobało mi się podejście przyjęte przez Wayfarera i flexaddicted, ale stwierdziłem (podobnie jak aZtral), że nie działa, ponieważ backgroundTapButton był jedynym elementem, który reagował na interakcję użytkownika. To doprowadziło mnie do umieszczenia wszystkich trzech jego podglądów podrzędnych: _picker, _pickerToolbar i backgroundTapButton wewnątrz widoku zawierającego (popup), który był następnie animowany na ekranie i poza nim. Potrzebowałem również przycisku Anuluj na pasku _pickerToolbar. Oto odpowiednie elementy kodu dla widoku wyskakującego (musisz podać własne źródło danych selektora i metody delegata).
źródło