Chcę używać widoku UITableview z różnymi niestandardowymi tableViewCells. Moje 3 komórki to:
- Cell1: powinien mieć obraz i etykietę.
- Cell2: powinien mieć dwie etykiety.
- Cell3: powinien mieć dayPicker.
Nie chcę kodować tagu dla komórek. Jak mogę sobie z tym poradzić w Swift. Czy muszę kodować własną klasę dla każdej komórki? Czy mogę używać jednego tableviewController? Jak mogę wypełnić dane w różnych komórkach?
Chciałbym wygenerować tableView, jak aplikację kontaktową na urządzeniu z systemem iOS.
swift
uitableview
Easyglider
źródło
źródło
Odpowiedzi:
Zacznę najpierw od odpowiedzi na twoje pytania.
Czy muszę kodować własną klasę dla każdej komórki? => Tak, uważam, że tak. Przynajmniej zrobiłbym to w ten sposób.
Czy mogę użyć jednego tableviewController? => Tak, możesz. Możesz jednak mieć również widok tabeli w kontrolerze widoku.
Jak mogę wypełnić dane w różnych komórkach? => W zależności od warunków możesz wypełnić dane w różnych komórkach. Na przykład załóżmy, że chcesz, aby pierwsze dwa wiersze przypominały komórki pierwszego typu. Po prostu tworzysz / ponownie używasz pierwszego typu komórek i ustawiasz jego dane. Myślę, że będzie wyraźniej, gdy pokażę ci zrzuty ekranu.
Podam przykład z TableView wewnątrz ViewController. Gdy zrozumiesz główną koncepcję, możesz spróbować zmodyfikować ją tak, jak chcesz.
Krok 1: Utwórz 3 niestandardowe TableViewCells. Nazwałem to, FirstCustomTableViewCell, SecondCustomTableViewCell, ThirdCustomTableViewCell. Powinieneś używać bardziej znaczących nazw.
Krok 2: Przejdź do Main.storyboard i przeciągnij i upuść TableView do kontrolera widoku. Teraz wybierz widok tabeli i przejdź do inspektora tożsamości. Ustaw "Prototype Cells" na 3. Tutaj właśnie powiedziałeś swojemu TableView, że możesz mieć 3 różne rodzaje komórek.
Krok 3: Teraz wybierz pierwszą komórkę w swoim TableView i inspektorze tożsamości, umieść „FirstCustomTableViewCell” w polu Klasa niestandardowa, a następnie ustaw identyfikator jako „firstCustomCell” w inspektorze atrybutów.
Zrób to samo dla wszystkich innych - ustaw ich klasy niestandardowe odpowiednio jako „SecondCustomTableViewCell” i „ThirdCustomTableViewCell”. Ustaw również identyfikatory kolejno jako secondCustomCell i thirdCustomCell.
Krok 4: Edytuj niestandardowe klasy komórek i dodaj gniazda zgodnie z potrzebami. Zredagowałem go na podstawie twojego pytania.
PS: Musisz umieścić wyloty w definicji klasy.
Tak więc w pliku FirstCustomTableViewCell.swift pod
umieściłbyś swoją etykietę i punkty wyświetlania obrazu.
aw SecondCustomTableViewCell.swift dodaj dwie etykiety, takie jak-
a ThirdCustomTableViewCell.swift powinien wyglądać następująco:
Krok 5: W swoim ViewController utwórz Outlet dla swojego TableView i ustaw połączenie z storyboardu. Ponadto należy dodać UITableViewDelegate i UITableViewDataSource w definicji klasy jako listę protokołów. Twoja definicja klasy powinna wyglądać następująco:
Następnie dołącz UITableViewDelegate i UITableViewDatasource widoku tabeli do kontrolera. W tym momencie twój viewController.swift powinien wyglądać następująco:
PS: Jeśli chcesz użyć TableViewController zamiast TableView wewnątrz ViewController, możesz pominąć ten krok.
Krok 6: Przeciągnij i upuść widoki obrazów i etykiety w komórce zgodnie z klasą Cell. a następnie zapewnić połączenie z ich gniazdami ze scenorysu.
Krok 7: Teraz zapisz wymagane metody UITableViewDatasource w kontrolerze widoku.
źródło
Aktualizacja Swift 3.0 + z minimalnym kodem
Podstawowa koncepcja: Utwórz widok tabeli z dynamicznymi prototypami komórek. Przypisz identyfikator i utwórz niestandardową klasę komórek widoku tabeli dla każdego prototypu komórki. Zainicjuj i pokaż komórki niestandardowe w metodzie delegata widoku tabeli.
1. Utwórz komórki w serii ujęć
Przeciągnij tableView do kontrolera widoku, dodaj do niego komórki prototypu, a następnie upuść element interfejsu użytkownika do komórek widoku tabeli, w razie potrzeby dodaj ograniczenie poprawnie.
2. Utwórz własne
UITableViewCell
klasyDodaj następujący kod do projektu. Umieszczam to tuż nad klasą kontrolera widoku.
3. Przypisz niestandardową klasę i identyfikator do prototypów komórek
Do każdego z prototypów komórek w scenorysie przypisz niestandardową klasę utworzoną w kroku 2, a następnie wprowadź unikalny identyfikator.
4. Połącz elementy UI w szybki kod
Kontroluj przeciągnij widok tabeli i połącz się z klasą kontrolera widoku. Sterowanie przeciągnij elementy interfejsu użytkownika, które zostaną dodane do prototypów komórek w kroku 1, i połącz się z odpowiednią klasą komórek widoku tabeli.
5. Dodaj kod, aby wyświetlić kontroler i sterować widokiem tabeli
Spraw, aby kontroler widoku był zgodny z delegatem widoku tabeli
W programie
viewDidLoad
skonfiguruj delegata widoku tabeli i źródło danych.Na koniec dodaj dwie metody delegatów, aby kontrolować widok tabeli, zgodnie z minimalnymi wymaganiami.
6. Spróbuj :)
źródło
Powyższe odpowiedzi są najlepszymi odpowiedziami, ale istnieje mnóstwo powodów, aby uzyskać ten problem. Oto kolejne potencjalne rozwiązanie dla każdego, kto ma ten problem:
Mój problem polegał na tym, że przechodziłem do klasy ViewController, a nie do widoku scenorysu. Więc moje odniesienie do komórki storyboardowej było bez znaczenia, ponieważ storyboard nie był używany.
Robiłem to:
Musiałem zrobić coś takiego:
Mam nadzieję, że to komuś pomoże.
źródło
UITableViewController
dziedziczyUIViewController
to, co już zostałoUITableviewDataSource
&UITableviewDelegate
zmapowane na sobie.Możesz podklasować
UITableViewController
lub użyćTableView
wewnątrz swojejViewController
. Następnie należy zaimplementować wymagane metody (cellForRowAtIndexPath
and numberOfRowsInSection
), które są zadeklarowane w plikuUITableviewDataSource
.Również w scenorysie musisz stworzyć prototypy komórek z unikalnym identyfikatorem.
Istnieją podstawowe typy komórek, z (na przykład tytuł, podtytuł) - możesz ich również użyć, jeśli nie potrzebujesz specjalnej konfiguracji.
Tak więc w przypadku selektora tak, musisz utworzyć własną niestandardową komórkę. Utwórz niezbędny
UITableViewCell
selektor dat przechowywania klas niestandardowych i upewnij się, że używasz delegata, aby odesłać żądany wynik z powrotem do swojegoViewController
.źródło