Mam UITableView, który w niektórych przypadkach może być pusty. Zamiast więc wyświetlać obraz tła aplikacji, wolałbym wydrukować przyjazny komunikat na ekranie, taki jak:
Ta lista jest teraz pusta
Jaki jest najprostszy sposób na zrobienie tego?
iphone
ios
uitableview
uiview
cateof
źródło
źródło
Odpowiedzi:
Właściwość backgroundView UITableView jest Twoim przyjacielem.
W
viewDidLoad
lub w dowolnym miejscu, w którymreloadData
powinieneś określić, czy twoja tabela jest pusta, czy nie, i zaktualizuj właściwość backgroundView UITableView za pomocą UIView zawierającego UILabel lub po prostu ustaw ją na zero. Otóż to.Jest oczywiście możliwe, aby źródło danych UITableView pełniło podwójną funkcję i zwracało specjalną komórkę „lista jest pusta”, co wydaje mi się niezdarne. Nagle
numberOfRowsInSection:(NSInteger)section
musi obliczyć liczbę wierszy innych sekcji, o które nie pytano, aby upewnić się, że są również puste. Musisz także utworzyć specjalną komórkę, która ma pustą wiadomość. Nie zapominaj również, że prawdopodobnie musisz zmienić wysokość komórki, aby pomieścić pustą wiadomość. To wszystko jest wykonalne, ale wydaje się, że oprócz pomocy bandażowej.źródło
backgroundView
ukrytą właściwość jest drogą do zrobienia. ZDZNEmptyDataSet
, musimy użyć jegoemptyDataSetSource
tableView.backgroundView!.userInteraction = true
po ustawieniu liniitableView.backgroundView = constructMyViewWithButtons()
lub w inny sposób.To samo, co odpowiedź Jhonstona, ale wolałem to jako rozszerzenie:
Stosowanie:
źródło
func numberOfSections(in tableView: UITableView) -> Int
metodyW oparciu o odpowiedzi tutaj, oto krótkie zajęcia, które stworzyłem, z których możesz korzystać w swoim
UITableViewController
.W swoim
UITableViewController
możesz to wywołaćnumberOfSectionsInTableView(tableView: UITableView) -> Int
Z niewielką pomocą http://www.appcoda.com/pull-to-refresh-uitableview-empty/
źródło
viewController.tableView.separatorStyle = .none
nie jest wymagane.Polecam bibliotekę: DZNEmptyDataSet
Najłatwiejszym sposobem dodania go do projektu jest użycie go z Cocaopodami w następujący sposób:
pod 'DZNEmptyDataSet'
W swoim TableViewController dodaj następującą instrukcję importu (Swift):
Następnie upewnij się, że klasa jest zgodna ze
DNZEmptyDataSetSource
iDZNEmptyDataSetDelegate
tak:W twojej
viewDidLoad
dodać następujące wiersze kodu:Teraz wszystko, co musisz zrobić, aby wyświetlić pusty stan, to:
Te metody nie są obowiązkowe, można też po prostu pokazać stan pusty bez przycisku itp.
Dla Swift 4
źródło
Jednym ze sposobów byłoby zmodyfikowanie źródła danych tak, aby zwracało się,
1
gdy liczba wierszy wynosi zero, i utworzenie wtableView:cellForRowAtIndexPath:
metodzie komórki specjalnego przeznaczenia (być może z innym identyfikatorem komórki) .Może się to nieco skomplikować, jeśli masz wiele kontrolerów widoku tabeli, które musisz utrzymywać, ponieważ ktoś w końcu zapomni wstawić zerową kontrolę. Lepszym podejściem jest utworzenie osobnej implementacji
UITableViewDataSource
implementacji, która zawsze zwraca pojedynczy wiersz z konfigurowalnym komunikatem (nazwijmy toEmptyTableViewDataSource
). Gdy dane zarządzane przez kontroler widoku tabeli ulegną zmianie, kod zarządzający zmianą sprawdzi, czy dane są puste. Jeśli nie jest pusty, ustaw kontroler widoku tabeli na jego zwykłe źródło danych; w przeciwnym razie ustaw go za pomocą instancjiEmptyTableViewDataSource
, która została skonfigurowana za pomocą odpowiedniego komunikatu.źródło
deleteRowsAtIndexPaths:withRowAnimation:
ponieważ liczba zwrócona znumberOfRowsInSection
musi pasować do wyniku $ numRows - $ rowsDeleted.W tym celu używam wiadomości titleForFooterInSection. Nie wiem, czy jest to nieoptymalne, czy nie, ale działa.
źródło
return tableView.numberOfRowsInSection(section) == 0 ? "This list is now empty" : nil
Więc dla bezpieczniejszego rozwiązania:
a
UICollectionView
także:Bardziej ogólne rozwiązanie:
źródło
Mogę tylko polecić przeciągnięcie i upuszczenie UITextView wewnątrz TableView po komórkach. Nawiąż połączenie z ViewController i ukryj / wyświetl go w razie potrzeby (np. Za każdym razem, gdy tabela zostanie ponownie załadowana).
źródło
Korzystanie z backgroundView jest w porządku, ale nie przewija się tak dobrze, jak w Mail.app.
Zrobiłem coś podobnego do tego, co zrobił xtravar .
Dodałem widok poza hierarchią widoków
tableViewController
.Następnie użyłem następującego kodu w
tableView:numberOfRowsInSection:
:Zasadniczo dodałem
emptyStateView
jako podwidoktableView
obiektu. Ponieważ separatory zachodziłyby na widok, ustawiłem ich kolor naclearColor
. Aby powrócić do domyślnego koloru separatora, możesz po prostu ustawić go nanil
.źródło
tableHeaderView
i upewnić się, że dopasowuje się do rozmiaru .Według Apple używanie kontrolera widoku kontenera jest właściwym sposobem na zrobienie tego .
Umieściłem wszystkie moje puste widoki stanu w oddzielnym Storyboard. Każdy w swojej własnej podklasie UIViewController. Treść dodaję bezpośrednio pod ich głównym widokiem. Jeśli potrzebna jest jakakolwiek akcja / przycisk, masz już kontroler do jej obsługi.
Następnie wystarczy utworzyć wystąpienie żądanego kontrolera widoku z tego Storyboard, dodać go jako kontroler widoku podrzędnego i dodać widok kontenera do hierarchii tableView (widok podrzędny). Twój pusty widok stanu będzie również przewijalny, co jest przyjemne i pozwala na zaimplementowanie przeciągania w celu odświeżenia.
Przeczytaj rozdział „Dodawanie kontrolera widoku podrzędnego do treści”, aby uzyskać pomoc dotyczącą implementacji.
Po prostu upewnij się, że podrzędna ramka widoku jest ustawiona jako,
(0, 0, tableView.frame.width, tableView.frame.height)
a elementy zostaną odpowiednio wyśrodkowane i wyrównane.źródło
Po pierwsze, problemy z innymi popularnymi podejściami.
BackgroundView
Widok tła nie jest ładnie wyśrodkowany, jeśli użyjesz prostego przypadku ustawienia go jako UILabel.
Komórki, nagłówki lub stopki do wyświetlenia wiadomości
To zakłóca twój kod funkcjonalny i wprowadza dziwne przypadki skrajne. Jeśli chcesz idealnie wyśrodkować swój przekaz, dodaje to kolejnego poziomu złożoności.
Rolling własnego kontrolera widoku tabeli
Tracisz wbudowane funkcje, takie jak refreshControl, i ponownie wymyślasz koło. Trzymaj się UITableViewController, aby uzyskać najlepsze możliwe do utrzymania wyniki.
Dodawanie UITableViewController jako kontrolera widoku podrzędnego
Mam przeczucie, że skończysz z problemami z zawartością w iOS 7+ - plus po co komplikować sprawy?
Moje rozwiązanie
Najlepszym rozwiązaniem, które wymyśliłem (i oczywiście nie jest to idealne rozwiązanie) jest utworzenie specjalnego widoku, który można umieścić na widoku przewijania i odpowiednio działać. To oczywiście komplikuje się w iOS 7 z szaleństwem contentInset, ale jest to wykonalne.
Na co musisz uważać:
Gdy już raz to zrozumiesz w jednej podklasie UIView, możesz jej użyć do wszystkiego - ładowania spinnerów, wyłączania widoków, wyświetlania komunikatów o błędach itp.
źródło
addSubView
, jest dołączony do widoku tabeli, co zawsze powoduje problemy z automatycznym układem.To najlepsze i najprostsze rozwiązanie.
źródło
Pokaż wiadomość dla pustej listy, Wether jej UITableView lub UICollectionView .
Zastosowania:
LUB:
Pamiętaj: nie zapomnij usunąć etykiety wiadomości na wypadek, gdyby dane pojawiały się po odświeżeniu.
źródło
Wybierz scenę tableviewController w serii ujęć
Przeciągnij i upuść UIView Dodaj etykietę wraz z wiadomością (np .: Brak danych)
utwórz wylot UIView (powiedzmy na przykład yournoDataView) na swoim TableViewController.
i in viewDidLoad
self.tableView.backgroundView = yourNoDataView
źródło
Korzystanie ze Swift 4.2
źródło
Możesz dodać to do swojej klasy podstawowej.
Pokaż to w ten sposób w klasie na temat pobierania danych z interfejsu API.
Ukryj to w ten sposób.
źródło
Szybka wersja, ale lepsza i prostsza forma. ** 3.0
Mam nadzieję, że spełni Twoje cele ......
W Twoim UITableViewController.
Klasa pomocnicza z funkcją:
źródło
Prawdopodobnie nie jest to najlepsze rozwiązanie, ale zrobiłem to, po prostu umieszczając etykietę na dole mojej tabeli i jeśli wiersze = 0, przypisuję jej jakiś tekst. Całkiem proste i osiąga to, co próbujesz zrobić, za pomocą kilku wierszy kodu.
Mam dwie sekcje w mojej tabeli (praca i szkoły)
źródło
Najłatwiejszym i najszybszym sposobem na to jest przeciągnięcie etykiety na panel boczny pod tableView. Utwórz wylot dla etykiety i tableView i dodaj instrukcję if, aby ukryć i wyświetlić etykietę i tabelę w razie potrzeby. Alternatywnie możesz dodać tableView.tableFooterView = UIView (frame: CGRect.zero) to do ciebie viewDidLoad (), aby nadać pustej tabeli wrażenie, że jest ona ukryta, jeśli tabela i widok tła mają ten sam kolor.
źródło
Zrobiłem kilka zmian, żebyśmy nie musieli ręcznie sprawdzać licznika, dodałem również ograniczenia dla etykiety, aby nic nie poszło źle, niezależnie od tego, jak duży jest komunikat, jak pokazano poniżej:
Stosowanie
źródło
Lub alternatywnie możesz użyć nieco konfigurowalnej, lekkiej biblioteki
SwiftEmptyState
źródło