Wyświetlam w grupie tableview
zawartość przeanalizowaną z XML. Chcę wyłączyć na nim zdarzenie kliknięcia (nie powinienem być w stanie go kliknąć) Tabela zawiera dwie grupy. Chcę wyłączyć zaznaczanie tylko dla pierwszej grupy, ale nie dla drugiej grupy. Kliknięcie pierwszego rzędu drugiej grupy navigates
do mojej rurki player view
.
Jak mogę wybrać tylko określone grupy lub wiersze?
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section!=0)
if(indexPath.row==0)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]];
}
Dzięki.
źródło
tableView:shouldHighlightRowAtIndexPath:
jest nowaUITableViewDelegate
metoda, która zwraca wartośćBOOL
zależną od tego, czy zaliczoneindexPath
powinno być wyróżnione. Jeśli tworzysz wersję 6.0 lub nowszą, zdecydowanie polecam ten nowy interfejs API.cell!.selectionStyle = .None
która siła rozpakowuje komórkę, umożliwiając dostęp do jej właściwości.Jeśli chcesz, aby wiersz (lub podzbiór wierszy) nie był wybierany , zaimplementuj
UITableViewDelegate
metodę-tableView:willSelectRowAtIndexPath:
(wspomnianą również przez TechZen). JeśliindexPath
nie można wybrać , zwróćnil
, w przeciwnym razie zwróćindexPath
. Aby uzyskać domyślne zachowanie zaznaczania, po prostu przywróćindexPath
przekazanądelegate
metodę, ale możesz także zmienić zaznaczenie wiersza, zwracając innąindexPath
.przykład:
źródło
Począwszy od iOS 6, możesz używać
Jeśli wrócisz
NO
, spowoduje to wyłączenie zarówno podświetlania wyboru, jak i sekwensów w serii ujęć powiązanych z tą komórką.Metoda jest wywoływana, gdy dotknięcie zejdzie w rzędzie. Powrót
NO
do tej wiadomości zatrzymuje proces selekcji i nie powoduje, że aktualnie wybrany wiersz traci wybrany wygląd, gdy dotyk jest wciśnięty.Dokumentacja protokołu UITableViewDelegate
źródło
Żadna z powyższych odpowiedzi tak naprawdę nie rozwiązuje problemu poprawnie. Powodem jest to, że chcemy wyłączyć zaznaczenie komórki, ale niekoniecznie widoki podrzędne wewnątrz komórki.
W moim przypadku prezentowałem UISwitch na środku wiersza i chciałem wyłączyć zaznaczanie dla reszty wiersza (który jest pusty), ale nie dla przełącznika! Właściwy sposób na zrobienie tego jest stąd w metodzie
gdzie oświadczenie formularza
wyłącza selekcję dla określonej komórki, jednocześnie umożliwiając użytkownikowi manipulowanie przełącznikiem, a tym samym użycie odpowiedniego selektora. Nie jest to prawdą, jeśli ktoś zablokuje interakcję użytkownika za pośrednictwem
metoda, która jedynie przygotowuje komórkę i nie pozwala na interakcję z UISwitch.
Ponadto przy użyciu metody
w celu usunięcia zaznaczenia komórki za pomocą instrukcji formularza
nadal pokazuje wybrany wiersz, podczas gdy użytkownik naciska na oryginalną zawartość Wyświetl widok komórki.
Tylko moje dwa centy. Jestem pewien, że wielu uzna to za przydatne.
źródło
willSelectRowAtIndexPath
ma ten sam problem, nie można wybierać widoków podrzędnych.Wyłapujesz selekcje za pomocą tych metod źródła danych.
W tych metodach sprawdzasz, czy wybrany wiersz to taki, który chcesz wybrać. Jeśli tak, podejmij działania, jeśli nie, nie rób nic.
Niestety nie można wyłączyć wyboru tylko dla jednej sekcji. To cały stół albo nic.
Możesz jednak ustawić
selectionStyle
właściwość komórek tabeli naUITableViewCellSelectionStyleNone
. Wierzę, że dzięki temu wybór będzie niewidoczny. W połączeniu z powyższymi metodami, które powinny sprawić, że komórki będą wyglądać całkowicie obojętnie z perspektywy użytkownika.Edycja01:
Jeśli masz tabelę, w której można wybierać tylko niektóre wiersze, ważne jest, aby komórki wybranych wierszy były wizualnie różne od wierszy, których nie można wybrać. Przycisk akcesoriów Chevron jest domyślnym sposobem na zrobienie tego.
Jakkolwiek to zrobisz, nie chcesz, aby użytkownicy próbowali wybierać wiersze i sądzili, że aplikacja źle działała, ponieważ wiersz nic nie robi.
źródło
Help -> Developer documentation
, a następnie skopiuj nazwy metod do pola wyszukiwania, aby zobaczyć, jak to działa. Dokumentacja programisty zawiera również przykładowy kod.Na przykład dla Swift 4.0 :
źródło
Musisz zrobić coś takiego jak poniżej, aby wyłączyć selekcję komórek w ramach
cellForRowAtIndexPath
metody:Aby pokazać komórkę wyszarzoną, umieść w
tableView:WillDisplayCell:forRowAtIndexPath
metodzie:Jedna metoda pozwala kontrolować interaktywność, druga pozwala kontrolować wygląd interfejsu użytkownika.
źródło
Aby zatrzymać tylko wybrane komórki, użyj:
Oprócz zapobiegania selekcji, zatrzymuje to również tableView: didSelectRowAtIndexPath: wywoływane dla komórek, które mają ustawione.
źródło
userInteractionEnabled
NIE na jedną komórkę (a dokładniej na jedną ścieżkę indeksu), interakcja użytkownika niektórych INNYCH komórek jest wyłączona. Nie mam pojęcia, dlaczego tak się dzieje za każdym razem, gdy korzystamuserInteractionEnabled
z komórek widoku tabeli. Czy to znany błąd, czy zrobiłem coś złego?if [indexPath row] == 0
), abyNO
wtableView:cellForRowAtIndexPath:
po dequeueing komórkę. Zwykle na początku działa poprawnie. Potem, po kilku wezwaniachreloadData
, nagle piąty rząd jest niedozwolony, a następnie czwarty rząd .. Nie mogę się dowiedzieć, kiedy to nastąpi. Całość wygląda na przypadkową.if [indexPath row] == 0) { set to NO } else { set to YES }
Możesz użyć tej
tableView:willDisplayCell
metody, aby wykonać wszelkiego rodzaju dostosowania do tableViewCell.W powyższym kodzie użytkownik może wybrać tylko pierwszy wiersz w drugiej sekcji tableView. Reszty nie można wybrać wszystkich wierszy. Dzięki! ~
źródło
Dla szybkiego:
źródło
Moje rozwiązanie oparte na modelu danych:
źródło
Dla szybkiego 4.0 To załatwi sprawę. Spowoduje to wyłączenie komórki w metodzie didSelectRowAtIndexPath, ale klikanie widoków podrzędnych będzie możliwe.
źródło
return indexPath.row == clickableIndex ? indexPath : nil
utrzymuje twój kod nieco czystszy ;-)Użyj tego, aby komórka wyglądała, jakby była wyłączona i nie można jej wybrać:
Ważne: pamiętaj, że jest to tylko właściwość stylizacji i tak naprawdę nie wyłącza komórki. Aby to zrobić, musisz sprawdzić
selectionStyle
wdidSelectRowAtIndexPath:
implementacji delegata:źródło
Podoba mi się Brian Chapados, odpowiedź powyżej. Oznacza to jednak, że logika może być zduplikowana zarówno w cellForRowAtIndexPath, jak i następnie w willSelectRowAtIndexPath, który łatwo można zsynchronizować. Zamiast powielać logikę, po prostu zaznacz opcję selectionStyle:
źródło
Znalazłem to przydatne, ponieważ działa zarówno z tabelami statycznymi, jak i dynamicznymi. Ustawiam wskaźnik ujawnienia tylko na te komórki, które chcę umożliwić wybór.
źródło
na Xcode 7 bez kodowania możesz po prostu wykonać następujące czynności:
W widoku konspektu wybierz komórkę widoku tabeli. (Komórka jest zagnieżdżona pod Kontrolą widoku tabeli Scena> Kontroler widoku tabeli> Widok tabeli. Może być konieczne ujawnienie tych obiektów, aby zobaczyć komórkę widoku tabeli)
W Inspektorze atrybutów znajdź pole o nazwie Wybór i wybierz Brak. Atrybut inspektora Dzięki tej opcji komórka nie zostanie podświetlona, gdy użytkownik ją stuknie.
źródło
PROSTY
Po prostu użyj
cell.userInteractionEnabled = YES;
do komórki, jeśli może nawigować icell.userInteractionEnabled = NO;
inaczejźródło
Zaimplementuj tylko metodę
tableView:willSelectRowAtIndexPath:
w źródle danych dla swojej tabeli. Jeśli chcesz, aby wiersz przy ścieżce był podświetlony, zwróć podaną ścieżkę indexPath. Jeśli nie, zwróć zero.Przykład z mojej aplikacji:
Zaletą tego jest to, że
shouldPerformSegueWithIdentifier:sender:
nie zostanie wywołane, jeśli powyższa metoda zwróci zero, chociaż powtarzam powyższy test tylko dla kompletności.źródło
Dla Xcode 6.3:
źródło
Zgadzam się z odpowiedzią Bryana
Jeśli zrobię
wtedy widoki podrzędne w komórce nie będą obsługiwane przez użytkownika.
Z drugiej strony ustawienie
uruchomi metodę didSelect, mimo że nie zaktualizuje wybranego koloru.
Korzystanie z willSelectRowAt jest sposobem na rozwiązanie mojego problemu. Przykład:
źródło
odejdź od tej opcji
tableView.allowsMultipleSelection = true
, aby usunąć zaznaczenie pozostałych komórek w sekcji podczas wybierania:źródło
w przypadku wersji 3.0 można użyć poniższego kodu, aby wyłączyć interakcję użytkownika z komórką UITableView
źródło