W wideo WWDC 2013 Apple sugeruje wyświetlanie selektora na miejscu w widoku tabeli w iOS 7. Jak wstawiać i animować widok między komórkami widoku tabeli?
W ten sposób z aplikacji kalendarza Apple:
W wideo WWDC 2013 Apple sugeruje wyświetlanie selektora na miejscu w widoku tabeli w iOS 7. Jak wstawiać i animować widok między komórkami widoku tabeli?
W ten sposób z aplikacji kalendarza Apple:
Odpowiedzi:
W systemie iOS7 firma Apple udostępniła przykładowy kod
DateCell
.Możesz pobrać przykładowy kod tutaj: DateCell .
źródło
Możesz skorzystać z odpowiedzi, którą wcześniej podałem poniżej, lub użyć tej nowej klasy w Swift, którą wykonałem, aby to zadanie było o wiele prostsze i czystsze: https://github.com/AaronBratcher/TableViewHelper
Uważam, że kod dostarczony przez Apple jest problematyczny z kilku powodów:
W przypadku tabel statycznych komórek definiuję komórkę selektora dat poniżej komórki wyświetlającej datę i mam flagę określającą, czy ją edytuję. Jeśli tak, zwracam odpowiednią wysokość komórki, w przeciwnym razie zwracam wysokość komórki równą zero.
Po kliknięciu wiersza z datą zmieniam flagę i wykonuję animację aktualizacji, aby pokazać selektor.
Jeśli mam wiele selektorów daty / czasu w tej samej tabeli, ustawiam flagi odpowiednio po kliknięciu i ponownie ładuję odpowiednie wiersze. Odkryłem, że mogę zachować moją statyczną tabelę, używać o wiele mniej kodu i łatwiej jest zrozumieć, co się dzieje.
źródło
Korzystając ze scenorysu i statycznej tabeli, udało mi się osiągnąć ten sam wynik, używając poniższego kodu. To świetne rozwiązanie, ponieważ jeśli masz wiele komórek o dziwnym kształcie lub chcesz mieć wiele komórek, które są dynamicznie pokazywane / ukrywane, ten kod będzie nadal działał.
źródło
[tableView reloadData];
Wezwanie nie jest wymagane. Obecnie wyłącza wybór wierszy, ale lepiej jest odznaczyć wiersz w ten sposób:[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
Pobrałem źródło DateCell od Apple i usunąłem plik storyboardu.
Jeśli chcesz taki bez storyboardu, spójrz na: https://github.com/ajaygautam/DateCellWithoutStoryboard
źródło
UIDatePicker
sięUIPickerView
. Próbowałem kilku rzeczy i jestem w stanie pokazać jepickerView
w każdej komórce, ale nie jest aktualizowana z każdą komórką. Pisałem na moje pytanie i kod tutaj . Proszę spojrzeć i byłoby bardzo miło, gdybyś mógł zaproponować mi rozwiązanie.UIDatePicker
zUIPickerView
ale z kilku błędów. 1. Awaria podczas otwieraniaUIPickerView
i przewijania tabeli. 2. Automatycznie przypisuje wartość do opcjiUILabel
Szczegóły w dolnych wierszach tabeli, gdy wartości są przypisywane do etykiety Szczegóły w górnych wierszach. Oto mój kodJednym z najlepszych samouczków na ten temat jest UIDatePicker w systemie iOS 7 - część 2 . Zasadniczo używam tutaj statycznych komórek widoku tabeli i implementuję kilka dodatkowych metod. Użyłem do tego Xamarin i C #:
Musisz być aktywny
Clip Subviews
.Ustawienie wysokości:
Niż zmienna klasowa:
private bool datePickerIsShowing = false;
Pokaż selektor dat:
Ukryj selektor dat:
I wywołując te funkcje:
źródło
Stworzyłem własny, niestandardowy kontroler widoku, aby uprościć proces dodawania wbudowanego selektora w widoku tabeli. Po prostu tworzysz podklasę i przestrzegasz kilku prostych zasad, a on obsługuje prezentację selektora dat.
Możesz go znaleźć tutaj wraz z przykładowym projektem, który pokazuje, jak go używać: https://github.com/ale84/ALEInlineDatePickerViewController
źródło
Znalazłem odpowiedź na usterkę w przykładzie komórki datecell firmy Apple, w której musisz mieć wiersz poniżej ostatniej komórki danych lub pojawia się błąd. W metodzie CellForRowAtIndexPath zamień wiersz ItemData na
Po wymianie przykładowego kodu mogę teraz wyświetlić komórkę datePicker bez umieszczania komórki pod nią.
Właśnie dołączyłem do stackoverflow, więc jeśli to jest w złym miejscu lub gdzie indziej, przepraszam.
źródło
Odpowiedź Aarona Bratchera zadziałała, chyba że została użyta z wieloma sekcjami. Animacje były nieco nierówne i nie zsuwało to zbyt dobrze kolejnych sekcji. Aby to naprawić, przejrzałem kolejny zestaw sekcji i przetłumaczyłem wiersze w dół o taką samą wartość, jak wysokość selektora dat.
Edytowałem didSelectRowAtIndexPath na:
źródło
Dodanie do poprzednich odpowiedzi,
Wypróbowałem rozwiązania @datinc i @Aaron Bratcher, oba działały świetnie, ale animacja nie była tak czysta w zgrupowanym statycznym tableView.
Po krótkiej zabawie dotarłem do tego kodu, który działa czysto i świetnie dla mnie -
Główną zmianą jest użycie -
aby zaktualizować wiersz, w ten sposób pozostałe sekcje tabeli i komórki nie będą animowane.
Mam nadzieję, że to komuś pomoże.
Shani
źródło
Dodawanie do poprzednich odpowiedzi i rozwiązania @Aaron Bratcher ...
Od czasu iOS 9 pojawiały się zacinające się animacje, a ładowanie stołu trwało trochę i było wystarczająco denerwujące. Zawęziłem to do tego, że selektory dat wolno ładują się z storyboardu. Dodanie selektorów programowo, a nie w scenorysie, poprawiło wydajność ładowania, a jako produkt uboczny animacja jest płynniejsza.
Usuń selektor dat z serii ujęć i miej pustą komórkę, dla której ustawiasz wysokość tak jak w poprzednich odpowiedziach, a następnie wywołaj inicjalizację na viewDidLoad:
Następnie zrealizuj akcję np
To ładuje tabelę znacznie szybciej niż poprzednio. Możesz również usunąć linię animacji z,
didSelectRowAtIndexPath
ponieważ animuje płynnie bez niej (ymmv).źródło
Użycie tej odpowiedzi bez animacji działa poprawnie w iOS 8.1. Przekształciłem go w Swift poniżej:
źródło
Oto inny sposób rozwiązania problemu bez statycznych liczb stałych. Wszystkie komórki mogą być używane w statycznych i dynamicznych widokach tabel. Ta metoda używa pojedynczej komórki zarówno dla wyboru tytułu, jak i daty!
Przy okazji możesz mieć dowolną liczbę selektorów daty w swoim stole!
Utwórz podklasę UITableViewCell :
Utwórz klasę CPDatePickerTableViewCell z naszego CPTableViewCell
W Twoim widoku kontroler zaimplementuj te dwie metody delegatów
Przykład ustawiania ograniczeń w programie Interface Builder
Dodatkowo napisałem niestandardowe klasy komórek dla UITextField i UITextView, gdzie tableView: didSelectRowAtIndexPath: jest wywoływana po wybraniu komórki!
CPTextFieldTableViewCell
CBTextViewTableViewCell
Wysokość komórki jest dynamiczna, a wiersz wzrośnie, gdy tekst zostanie zawinięty do nowego wiersza!
źródło
Najłatwiejszy sposób użycia DateCell w wersji Swift: użyj tego przykładu .
Przeciągnij klasę „ DateCellTableViewController.swift ” do projektu.
Otwórz „Main.storyboard” i skopiuj obiekt ViewController „DateCell” i wklej go do swojego storyboardu.
źródło