Mam element, UITableViewCell
który jest powiązany z obiektem i muszę stwierdzić, czy komórka jest widoczna. Z przeprowadzonych przeze mnie badań UITableView
wynika, że muszę w jakiś sposób uzyskać dostęp do tego, który go zawiera (stamtąd jest kilka sposobów, aby sprawdzić, czy jest widoczny). Zastanawiam się więc, czy UITableViewCell
ma wskaźnik do UITableView
komórki, czy też istniał inny sposób na pobranie wskaźnika z komórki?
100
[cell superView]
może?Odpowiedzi:
Aby uniknąć sprawdzania wersji systemu iOS, iteracyjnie chodź po nadzorze z widoku komórki, aż zostanie znaleziony UITableView:
źródło
@property (weak, nonatomic) UITableView *tableView;
itableView:cellForRowAtIndexPath:
tylko w zestawiecell.tableView = tableView;
.W iOS7 beta 5
UITableViewWrapperView
jest nadzorem plikuUITableViewCell
. Jest równieżUITableView
superwizjąUITableViewWrapperView
.Więc dla iOS 7 rozwiązaniem jest
UITableView *tableView = (UITableView *)cell.superview.superview;
Tak więc dla iOS do iOS 6 rozwiązaniem jest
UITableView *tableView = (UITableView *)cell.superview;
źródło
UITableViewCell
kategorię za pomocą nowej metody,relatedTableView
która sprawdza wersję iOS i zwraca odpowiedni superView.Rozszerzenie Swift 5
Rekurencyjnie
Korzystanie z pętli
źródło
view != nil
Przed rozpakowaniem jest czek. Zaktualizowany jednak do czystszego koduPrzed iOS7, nadzór komórki był tym,
UITableView
który ją zawierał. Począwszy od iOS7 GM (a więc prawdopodobnie będzie również w publicznym wydaniu), nadzór komórki to, aUITableViewWrapperView
jej superview jestUITableView
. Istnieją dwa rozwiązania tego problemu.Rozwiązanie nr 1: Utwórz
UITableViewCell
kategorięJest to dobry zamiennik do używania
cell.superview
, ułatwia refaktoryzację istniejącego kodu - wystarczy wyszukać i zamienić go[cell relatedTable]
, a następnie wrzucić potwierdzenie, aby upewnić się, że jeśli hierarchia widoku zmieni się lub powróci w przyszłości, pojawi się natychmiast w twoich testach.Rozwiązanie nr 2: Dodaj słabe
UITableView
odniesienie doUITableViewCell
Jest to znacznie lepszy projekt, chociaż będzie wymagał nieco więcej refaktoryzacji kodu w istniejących projektach. W swojej
tableView:cellForRowAtIndexPath
użytku SOUITableViewCell jako klasy komórek lub upewnij się, że zwyczaj klasa komórek z podklasySOUITableViewCell
i przypisać tableView do komórki mienia Tableview. Wewnątrz komórki możesz odwołać się do zawierającego ją widoku tabeli, używającself.tableView
.źródło
[self.superview.superview isKindOfClass:[UITableView class]]
powinien być pierwszy, bo iOS 7 to coraz więcej.Jeśli jest widoczny, ma nadzór. I… niespodzianka… superview jest obiektem UITableView.
Jednak posiadanie Superview nie gwarantuje, że będziesz na ekranie. Ale UITableView zapewnia metody określania, które komórki są widoczne.
I nie, nie ma dedykowanego odniesienia z komórki do tabeli. Ale kiedy tworzysz podklasę UITableViewCell, możesz ją wprowadzić i ustawić podczas tworzenia. (Sam to często robiłem, zanim pomyślałem o hierarchii subview.)
Aktualizacja dla iOS7: firma Apple zmieniła tutaj hierarchię widoków podrzędnych. Jak zwykle podczas pracy z rzeczami, które nie są szczegółowo udokumentowane, zawsze istnieje ryzyko, że coś się zmieni. Znacznie bezpieczniej jest „przeszukiwać” hierarchię widoków, aż w końcu zostanie znaleziony obiekt UITableView.
źródło
Rozwiązanie Swift 2.2.
Rozszerzenie dla UIView, które rekurencyjnie wyszukuje widok z określonym typem.
lub bardziej zwarty (dzięki kabiroberai):
W swojej celi nazywasz to po prostu:
Pamiętaj, że UITableViewCell jest dodawany do UITableView tylko po wykonaniu cellForRowAtIndexPath.
źródło
lookForSuperviewOfType:
return superview as? T ?? superview?.superviewOfType(type)
Cokolwiek, co uda ci się zrobić, wywołując super widok lub za pośrednictwem łańcucha odpowiedzi, będzie bardzo delikatne. Najlepszym sposobem, aby to zrobić, jeśli komórki chcą coś wiedzieć, jest przekazanie do komórki obiektu, który odpowiada na jakąś metodę, która odpowiada na pytanie, które komórka chce zadać, i zlecenie kontrolerowi zaimplementowania logiki określania odpowiedzi (z twojego pytania wydaje mi się, że komórka chce wiedzieć, czy coś jest widoczne, czy nie).
Utwórz protokół delegata w komórce, ustaw delegata komórki na tableViewController i przenieś całą logikę „kontrolującą” interfejsu użytkownika w tableViewCotroller.
Komórki widoku tabeli powinny być widokiem dum, w którym będą wyświetlane tylko informacje.
źródło
Utworzyłem kategorię na UITableViewCell, aby uzyskać jej nadrzędny tableView:
Najlepsza,
źródło
Oto wersja Swift oparta na powyższych odpowiedziach. Uogólniłem do
ExtendedCell
późniejszego wykorzystania.Mam nadzieję, że to pomoże :)
źródło
Oparłem to rozwiązanie na sugestii Gabe'a, że
UITableViewWrapperView
obiekt jestUITableViewCell
nadzorem obiektu w iOS7 beta5.Podklasa
UITableviewCell
:źródło
Pożyczyłem i zmodyfikowałem trochę z powyższej odpowiedzi i wymyśliłem następujący fragment.
Przekazywanie w klasie zapewnia elastyczność w zakresie przechodzenia i pobierania widoków innych niż UITableView w innych przypadkach.
źródło
Moje rozwiązanie tego problemu jest nieco podobne do innych rozwiązań, ale używa eleganckiej pętli for i jest krótkie. Powinien również być przyszłościowy:
źródło
for (view = self.superview; view && ![view isKindOfClass:UITableView.class]; view = view.superview);
źródło
Zamiast superviewu spróbuj użyć ["UItableViewvariable" visibleCells].
Użyłem tego w pętli foreach, aby zapętlić komórki, które widziała aplikacja i zadziałało.
Działa jak marzenie.
źródło
Minimalnie przetestowany, ale ten nieogólny przykład Swift 3 wydaje się działać:
źródło
ten kod
`UITableView *tblView=[cell superview];
da ci wystąpienie UItableview, które zawiera komórkę widoku tabulatoraźródło
Proponuję przejść przez hierarchię widoków w ten sposób, aby znaleźć nadrzędny widok UITableView:
W przeciwnym razie kod złamie gdy Apple zmienia hierarchię widok ponownie .
Inna odpowiedź, która również przechodzi przez hierarchię, jest rekurencyjna.
źródło
http://www.curiousfind.com/blog/646 Dziękuję
źródło
Możesz to uzyskać za pomocą jednej linii kodu.
źródło
źródło
from @idris answer Napisałem rozszerzenie dla UITableViewCell w Swift
źródło