UITableView
ustawione na komórki statyczne.
Czy można programowo ukryć niektóre komórki?
ios
objective-c
uitableview
Shmidt
źródło
źródło
IBOutletCollection
ale nie widzę, jak to by miało znaczenie. Ściągnąłem kod dopiero wczoraj, więc nie sądzę, że jest to stara wersja.Aby ukryć komórki statyczne w UITable:
W klasie delegata kontrolera UITableView:
Cel C:
Szybki:
Ta metoda zostanie wywołana dla każdej komórki w UITable. Po wywołaniu komórki, którą chcesz ukryć, ustawiamy jej wysokość na 0. Identyfikujemy komórkę docelową, tworząc dla niej gniazdo:
źródło
ClipToBounds
problemu, możesz również ustawić komórkę jako ukrytą. Wydaje mi się to czystsze. ;-)Najlepszy sposób jest opisany na następującym blogu http://ali-reynolds.com/2013/06/29/hide-cells-in-static-table-view/
źródło
Moje rozwiązanie idzie w podobnym kierunku, co Gareth, chociaż niektóre rzeczy robię inaczej.
Tutaj idzie:
1. Ukryj komórki
Nie ma możliwości bezpośredniego ukrycia komórek.
UITableViewController
to źródło danych, które udostępnia komórki statyczne i obecnie nie ma sposobu, aby powiedzieć „nie dostarczaj komórki x”. Musimy więc zapewnić własne źródło danych, które jest delegowane doUITableViewController
w celu uzyskania statycznych komórek.Najłatwiej jest tworzyć podklasy
UITableViewController
i zastępować wszystkie metody, które muszą zachowywać się inaczej podczas ukrywania komórek .W najprostszym przypadku (tabela z pojedynczą sekcją, wszystkie komórki mają tę samą wysokość) wyglądałoby to tak:
Jeśli tabela ma wiele sekcji lub komórki mają różne wysokości, musisz zastąpić więcej metod. Ta sama zasada obowiązuje tutaj: musisz przesunąć indexPath, sekcję i wiersz przed delegowaniem do super.
Należy również pamiętać, że parametr indexPath dla metod takich jak
didSelectRowAtIndexPath:
będzie różny dla tej samej komórki, w zależności od stanu (tj. Liczby komórek ukrytych). Dlatego prawdopodobnie dobrym pomysłem jest zawsze kompensowanie dowolnego parametru indexPath i praca z tymi wartościami.2. Ożyw zmianę
Jak już powiedział Gareth, możesz mieć poważne usterki, jeśli animujesz zmiany za pomocą
reloadSections:withRowAnimation:
metody.Dowiedziałem się, że jeśli zadzwonisz
reloadData:
zaraz potem, animacja znacznie się poprawi (pozostały tylko drobne usterki). Tabela jest wyświetlana poprawnie po animacji.Więc to co robię to:
źródło
numberOfRowsInSection:
wywoływana jest tylko przy pierwszym ładowaniu tabeli. Kiedy wywołuję [self.tableView reloadData] -numberOfRowsInSection:
nigdy nie jestem ponownie wywoływany. TylkocellForRowAtIndexPath:
jest wezwany. czego mi brakuje?cellOneOutlet.hidden = true
teraz zastąp poniższą metodę, sprawdź, który stan komórki jest ukryty i zwróć wysokość 0 dla tych komórek. Jest to jeden z wielu sposobów na ukrycie dowolnej komórki w statycznym widoku tableView.
źródło
let tableViewCell = super.tableView(tableView,cellForRowAtIndexPath: indexPath)
. Zakładam, że jest zastąpiony przezlet tableViewCell = tableView.cellForRow(at: indexPath as IndexPath)
.UITableViewController
, nie mam żadnychUITableView
metod delegata. Aby to zadzwoniłoheightForRow
, czy muszę mieć również inne metody?Wymyśliłem alternatywę, która faktycznie ukrywa sekcje i ich nie usuwa. Wypróbowałem podejście @ henning77, ale napotykałem problemy, gdy zmieniałem liczbę sekcji statycznego widoku UITableView. Ta metoda zadziałała dla mnie naprawdę dobrze, ale przede wszystkim próbuję ukryć sekcje zamiast wierszy. Z powodzeniem usuwam niektóre wiersze w locie, ale jest dużo bardziej bałaganiarski, więc próbowałem pogrupować elementy w sekcje, które muszę pokazać lub ukryć. Oto przykład tego, jak ukrywam sekcje:
Najpierw deklaruję właściwość NSMutableArray
W viewDidLoad (lub po przeszukaniu danych) możesz dodać sekcje, które chcesz ukryć do tablicy.
Następnie zaimplementuj następujące metody delegata TableView
Następnie ustaw wysokość nagłówka i stopki na 1 dla ukrytych sekcji, ponieważ nie możesz ustawić wysokości na 0. Powoduje to dodatkowe 2 piksele, ale możemy to nadrobić, dostosowując wysokość następnego widocznego nagłówka.
Następnie, jeśli masz określone wiersze do ukrycia, możesz dostosować numberOfRowsInSection i które wiersze są zwracane w cellForRowAtIndexPath. W tym przykładzie mam sekcję, która ma trzy wiersze, gdzie dowolne trzy mogą być puste i należy je usunąć.
Użyj tego offsetIndexPath, aby obliczyć indexPath dla wierszy, w których warunkowo usuwasz wiersze. Nie jest potrzebne, jeśli ukrywasz tylko sekcje
Istnieje wiele metod do zastąpienia, ale w tym podejściu podoba mi się to, że można je ponownie wykorzystać. Skonfiguruj tablicę hiddenSections, dodaj do niej, a spowoduje to ukrycie właściwych sekcji. Ukrywanie rzędów jest trochę trudniejsze, ale możliwe. Nie możemy po prostu ustawić wysokości wierszy, które chcemy ukryć, na 0, jeśli używamy zgrupowanego UITableView, ponieważ obramowania nie zostaną poprawnie narysowane.
źródło
NSMutableSet
dlahiddenSections
zamiast. Jest to o wiele szybsze, ponieważ najczęściej testujesz członkostwo.NSMutableSet
forhiddenSections
, chociaż rozumiem, że punkt twojej odpowiedzi był bardziej koncepcyjny niż drobiazgowy co do tego, jakiego typu struktury danych powinieneś użyć.Okazuje się, że możesz ukrywać i wyświetlać komórki w statycznym widoku UITableView - i za pomocą animacji. I nie jest to takie trudne.
Projekt demonstracyjny
Film z projektu demonstracyjnego
Istota:
Use tableView:heightForRowAtIndexPath:
do dynamicznego określania wysokości komórek na podstawie pewnego stanu.tableView.beginUpdates();tableView.endUpdates()
tableView.cellForRowAtIndexPath:
środkatableView:heightForRowAtIndexPath:
. Użyj zapisanych w pamięci podręcznej indexPaths, aby rozróżnić komórki.Więcej informacji na moim blogu (język rosyjski)
źródło
Tak, na pewno jest to możliwe, chociaż obecnie borykam się z tym samym problemem. Udało mi się zmusić komórki do ukrycia i wszystko działa dobrze, ale obecnie nie mogę sprawić, by obiekt był dobrze ożywiony. Oto co znalazłem:
Ukrywam wiersze na podstawie stanu przełącznika WŁ. / WYŁ. W pierwszym rzędzie pierwszej sekcji. Jeśli przełącznik jest włączony, pod nim znajduje się 1 rząd w tej samej sekcji, w przeciwnym razie są 2 różne rzędy.
Mam selektor wywoływany, gdy przełącznik jest przełączany, i ustawiam zmienną, aby wskazać, w jakim stanie jestem. Następnie wzywam:
I przesłonić tableView: willDisplayCell: forRowAtIndexPath: funkcję i jeśli komórka ma być ukryty zrobić to:
To ukrywa komórkę i jej zawartość, ale nie usuwa zajmowanej przez nią przestrzeni.
Aby usunąć spację, nadpisz tableView: heightForRowAtIndexPath: function i zwróć 0 dla wierszy, które powinny być ukryte.
Musisz także nadpisać tableView: numberOfRowsInSection: i zwrócić liczbę wierszy w tej sekcji. Musisz zrobić tutaj coś dziwnego, aby jeśli twoja tabela jest stylem zgrupowanym, zaokrąglone rogi wystąpiły we właściwych komórkach. W mojej statycznej tabeli znajduje się pełny zestaw komórek dla sekcji, więc jest pierwsza komórka zawierająca opcję, następnie 1 komórka dla opcji stanu WŁĄCZENIA i 2 kolejne komórki dla opcji stanu WYŁĄCZENIA, łącznie 4 komórki. Kiedy opcja jest WŁĄCZONA, muszę zwrócić 4, obejmuje to opcję ukrytą, tak aby ostatnia wyświetlona opcja miała zaokrąglone pole. Gdy opcja jest wyłączona, dwie ostatnie opcje nie są wyświetlane, więc zwracam 2. To wszystko wydaje się niezgrabne. Przepraszam, jeśli nie jest to zbyt jasne, trudno to opisać. Aby zilustrować konfigurację, oto konstrukcja sekcji tabeli w IB:
Więc gdy opcja jest WŁĄCZONA, w tabeli pojawiają się dwa wiersze:
Gdy opcja jest WYŁĄCZONA, tabela wyświetla cztery wiersze, które są:
To podejście nie wydaje się poprawne z kilku powodów, tak daleko, jak osiągnąłem z moich dotychczasowych eksperymentów, więc daj mi znać, jeśli znajdziesz lepszy sposób. Problemy, które zaobserwowałem do tej pory to:
Nieprawidłowe jest informowanie tabeli, że liczba wierszy różni się od tego, co przypuszczalnie zawiera dane bazowe.
Nie mogę ożywić zmiany. Próbowałem użyć tableView: reloadSections: withRowAnimation: zamiast reloadData i wyniki wydają się nie mieć sensu, nadal próbuję to uruchomić. Obecnie wydaje się, że tableView nie aktualizuje poprawnych wierszy, więc jeden pozostaje ukryty, który powinien zostać wyświetlony, a pod pierwszym wierszem pozostaje puste miejsce. Myślę, że może to być związane z pierwszym punktem dotyczącym danych bazowych.
Miejmy nadzieję, że ktoś będzie w stanie zasugerować alternatywne metody lub może to, jak rozszerzyć animację, ale może to pomoże Ci zacząć. Przepraszam za brak hiperłączy do funkcji, wstawiłem je, ale zostały odrzucone przez filtr spamu, ponieważ jestem dość nowym użytkownikiem.
źródło
[[self tableView] reloadData];
jeszcze raz po ukryciureturn [super tableView:tableView cellForRowAtIndexPath:indexPath];
naUITableViewController
podklasy dla tworzenia komórek statycznych. Ścieżki indeksu są indeksowane statycznie - nie dynamicznie ...Zgodnie z odpowiedzią Justasa, ale dla Swift 4:
źródło
tableView.reloadRows(at:, with:)
zaktualizowanie komórek, jeśli zmienisz wysokość, gdy wiersz jest już widoczny.OK, po kilku próbach mam rzadką odpowiedź. Używam zmiennej „isHidden” lub „hidden”, aby sprawdzić, czy ta komórka powinna być ukryta.
utwórz IBOutlet do kontrolera widoku.
@IBOutlet weak var myCell: UITableViewCell!
Zaktualizuj
myCell
w swojej funkcji niestandardowej, na przykład możesz dodać ją w viewDidLoad:override func viewDidLoad() { super.viewDidLoad() self.myCell.isHidden = true }
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let cell = super.tableView(tableView, cellForRowAt: indexPath) guard !cell.isHidden else { return 0 } return super.tableView(tableView, heightForRowAt: indexPath) }
Zmniejszy to logikę w metodzie delegowania i wystarczy skupić się na wymaganiach biznesowych.
źródło
Powyższe odpowiedzi, które ukrywają / pokazują komórki, zmieniają rowHeight lub bałagan z ograniczeniami automatycznego układu, nie działają dla mnie z powodu problemów z automatycznym układem. Kod stał się nie do zniesienia.
W przypadku prostego statycznego stołu najlepiej działało dla mnie:
Oto przykład z mojego kontrolera widoku tabeli:
źródło
Prosta metoda kompatybilna z iOS 11 i IB / Storyboard
W przypadku iOS 11 stwierdziłem, że zmodyfikowana wersja odpowiedzi Mohameda Saleha działa najlepiej, z pewnymi ulepszeniami opartymi na dokumentacji Apple. Animuje się ładnie, unika wszelkich brzydkich hacków lub zakodowanych wartości i używa wysokości wierszy już ustawionych w Interface Builder .
Podstawową koncepcją jest ustawienie wysokości wiersza na 0 dla wszystkich ukrytych wierszy. Następnie użyj,
tableView.performBatchUpdates
aby wywołać animację, która działa konsekwentnie.Ustaw wysokości celi
Będziesz chciał się upewnić
cellIsHidden
iindexPathOfHiddenCell
są ustawione odpowiednio do twojego przypadku użycia. Dla mojego kodu są to właściwości mojego kontrolera widoku tabeli.Przełączanie komórki
Bez względu na metodę kontrolującą widoczność (prawdopodobnie działanie przycisku lub
didSelectRow
), przełącz stan cellIsHidden wewnątrzperformBatchUpdates
bloku:Apple zaleca
performBatchUpdates
ponadbeginUpdates
/endUpdates
kiedy tylko jest to możliwe.źródło
Znalazłem rozwiązanie do animacji ukrywania komórek w statycznej tabeli.
Potrzebny jest tylko jeden dodatkowy słownik:
I spójrz na implementację MyTableViewController. Potrzebujemy dwóch metod, aby przekonwertować indexPath między widocznymi i niewidocznymi indeksami ...
Jedna IBAction w sprawie zmiany wartości UISwitch:
Niektóre metody UITableViewDataSource i UITableViewDelegate:
źródło
Odpowiedz szybko :
Dodaj następującą metodę w TableViewController:
jeśli tableView spróbuje narysować komórkę, którą chcesz ukryć, nie wyświetli jej, ponieważ jej wysokość zostanie ustawiona na 0pt dzięki powyższej metodzie, wszystko inne pozostaje niezmienione.
Należy pamiętać, że
indexPathOfCellYouWantToHide
można to zmienić w dowolnym momencie :)źródło
W> Swift 2.2 połączyłem tutaj kilka odpowiedzi.
Zrób gniazdko ze scenorysu, aby połączyć się z staticCell.
Chcę ukryć moją pierwszą komórkę, więc ustawiłem wysokość na 0, jak opisano powyżej.
źródło
Swift 4:
źródło
Aby uzyskać najłatwiejszy scenariusz, gdy ukryjesz komórki na samym dole widoku tabeli, możesz dostosować contentInset tableView po ukryciu komórki:
źródło
To nowy sposób na zrobienie tego za pomocą https://github.com/k06a/ABStaticTableViewController
źródło
Rozwiązanie z k06a ( https://github.com/k06a/ABStaticTableViewController ) jest lepsze, ponieważ ukrywa całą sekcję, w tym nagłówki i stopki komórek, gdzie to rozwiązanie ( https://github.com/peterpaulis/StaticDataTableViewController ) ukrywa wszystko oprócz stopki.
EDYTOWAĆ
Właśnie znalazłem rozwiązanie, jeśli chcesz ukryć stopkę
StaticDataTableViewController
. Oto, co musisz skopiować w pliku StaticTableViewController.m:źródło
Na pewno możesz. Najpierw wróć do swojej tabeli, wyświetl liczbę komórek, które chcesz wyświetlić, a następnie wywołaj,
super
aby uzyskać określoną komórkę ze swojego storyboardu i zwróć ją dla tableView:Jeśli twoje komórki mają inną wysokość, zwróć ją również:
źródło
Oprócz rozwiązania @Saleh Masum:
Jeśli wystąpią błędy automatycznego układu , możesz po prostu usunąć ograniczenia z pliku
tableViewCell.contentView
Swift 3:
To rozwiązanie zależy od przepływu Twojej aplikacji . Jeśli chcesz pokazać / ukryć komórkę w tej samej instancji kontrolera widoku, może to nie być najlepszy wybór, ponieważ usuwa ograniczenia .
źródło
Mam lepszy sposób na dynamiczne ukrywanie statycznych komórek, a nawet sekcji, bez żadnych hacków.
Ustawienie wysokości wiersza na 0 może ukryć wiersz, ale to nie działa, jeśli chcesz ukryć całą sekcję, która będzie zawierać spacje, nawet jeśli ukryjesz wszystkie wiersze.
Moje podejście polega na zbudowaniu tablicy sekcji komórek statycznych. Następnie zawartość widoku tabeli będzie sterowana przez tablicę sekcji.
Oto przykładowy kod:
W ten sposób możesz złożyć cały kod konfiguracji bez konieczności pisania nieprzyjemnego kodu do obliczania liczby wierszy i sekcji. I oczywiście nie ma
0
już wysokości.Ten kod jest również bardzo łatwy w utrzymaniu. Na przykład, jeśli chcesz dodać / usunąć więcej komórek lub sekcji.
Podobnie, możesz utworzyć tablicę tytułów nagłówków sekcji i tablicę tytułów stopek sekcji, aby dynamicznie skonfigurować tytuły sekcji.
źródło