Po dotknięciu wiersza w UITableView
wierszu jest on podświetlony i zaznaczony. Czy można to wyłączyć, więc stuknięcie wiersza nic nie robi?
Po dotknięciu wiersza w UITableView
wierszu jest on podświetlony i zaznaczony. Czy można to wyłączyć, więc stuknięcie wiersza nic nie robi?
Odpowiedzi:
Dla mnie następujące działało dobrze:
tableView.allowsSelection = false
Oznacza to, że didSelectRowAt#
po prostu nie będzie działać. Innymi słowy, dotknięcie rzędu stołu jako takiego nie zrobi absolutnie nic. (I dlatego, oczywiście, nigdy nie będzie wybranej animacji.)
(Pamiętaj, że jeśli w komórkach masz UIButton
lub jakiekolwiek inne formanty, oczywiście te formanty nadal będą działać. Wszelkie formanty, które akurat masz w komórce tabeli, są całkowicie niezwiązane ze zdolnością UITableView do umożliwienia Ci „wyboru wiersza” za pomocą didSelectRowAt#
.)
Należy również zauważyć, że: To nie działa, gdy UITableView
jest w trybie edycji. Aby ograniczyć wybór komórek w trybie edycji, użyj kodu jak poniżej:
tableView.allowsSelectionDuringEditing = false
selectionStyle
właściwość na komórce: cell.selectionStyle = UITableViewCellSelectionStyle.None
w Swift lub cell.selectionStyle = UITableViewCellSelectionStyleNone
w Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
zadzwonić, cell.selectionStyle = .None
jest pożądane. Jeśli nie chcesz lub nie chcesz wywoływać funkcji delegowania (tj. Mając pole tekstowe w tableViewCell) ustawienie tableView.allowsSelection = false
jest w porządku.
Wszystko, co musisz zrobić, to ustawić styl selekcji na UITableViewCell
instancji za pomocą:
Cel C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
lub
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 i 4.x:
cell.selectionStyle = .none
Ponadto upewnij się, że albo nie implementujesz -tableView:didSelectRowAtIndexPath:
w widoku delegatu widoku tabeli, albo jawnie wykluczysz komórki, których nie chcesz wykonywać, jeśli je zaimplementujesz.
Ponieważ niedawno przeczytałem ten post i pomogło mi to, chciałem opublikować kolejną odpowiedź, aby skonsolidować wszystkie odpowiedzi (dla potomności).
Tak więc w rzeczywistości istnieje 5 różnych odpowiedzi w zależności od pożądanej logiki i / lub wyniku:
1. Aby wyłączyć niebieskie podświetlenie bez zmiany jakiejkolwiek innej interakcji komórki:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Używam tego, gdy mam UIButton - lub inne kontrolki - hostowane w UITableViewCell i chcę, aby użytkownik mógł wchodzić w interakcje z kontrolkami, ale nie z samą komórką.
UWAGA : Jak zauważył powyżej Tony Million, NIE zapobiega totableView:didSelectRowAtIndexPath:
. Aby obejść ten problem, używam prostych instrukcji „jeśli”, najczęściej testując sekcję i unikając działań dla określonej sekcji.
Innym sposobem, w jaki pomyślałem o przetestowaniu podsłuchu takiej komórki, jest:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// A case was selected, so push into the CaseDetailViewController
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
// Handle tap code here
}
}
2. Aby to zrobić dla całej tabeli, możesz zastosować powyższe rozwiązanie do każdej komórki w tabeli, ale możesz również to zrobić:
[tableView setAllowsSelection:NO];
W moich testach nadal pozwala to UITableViewCell
na interaktywne sterowanie wewnątrz .
3. Aby ustawić komórkę jako „tylko do odczytu”, możesz po prostu to zrobić:
[cell setUserInteractionEnabled:NO];
4.Aby uczynić całą tabelę „tylko do odczytu”
[tableView setUserInteractionEnabled:NO];
5. Aby określić w locie, czy podświetlić komórkę (która zgodnie z tą odpowiedzią domyślnie obejmuje wybór), możesz zaimplementować następującą UITableViewDelegate
metodę protokołu:
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
tableView:shouldHighlightRowAtIndexPath:
, co jest ogólnie (nie zawsze) moim preferowanym podejściem.
Podsumowując, moim zdaniem, prawidłowe odpowiedzi są oparte na moim własnym doświadczeniu we wdrażaniu tego:
Jeśli chcesz wyłączyć zaznaczanie tylko niektórych komórek, użyj:
cell.userInteractionEnabled = NO;
Oprócz zapobiegania selekcji, zatrzymuje to również tableView: didSelectRowAtIndexPath: wywoływane dla komórek, które mają ustawione. (Podziękowania dla Tony'ego Milliona za tę odpowiedź, dziękuję!)
Jeśli masz w komórkach przyciski, które należy kliknąć, musisz zamiast tego:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
musisz też zignorować kliknięcia komórki w - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.
Jeśli chcesz wyłączyć zaznaczanie dla całej tabeli, użyj:
tableView.allowsSelection = NO;
(Podziękowania dla Paulo De Barrosa, dzięki!)
Od iOS 6.0 UITableViewDelegate
ma tableView:shouldHighlightRowAtIndexPath:
. (Przeczytaj o tym w Dokumentacji iOS ).
Ta metoda pozwala oznaczyć określone wiersze jako nie do podświetlenia (i domyślnie, nie można ich wybrać) bez konieczności zmiany stylu wyboru komórki, bałagania się obsługą zdarzeń komórki userInteractionEnabled = NO
lub innymi udokumentowanymi tutaj technikami.
Można również wyłączyć wybór wiersza z interfejsem budowniczy siebie wybierając NoSelection
z selection
opcji (Właściwości UITableView) w oknie inspektora, jak pokazano na poniższym obrazie
NAPRAWIONE ROZWIĄZANIE DLA SWIFT 3
cell.selectionStyle = .none
Jeśli chcesz, aby zaznaczenie tylko migało, a nie pozostało w wybranym stanie, możesz zadzwonić pod numer
didSelectRowAtIndexPath
następujące
[tableView deselectRowAtIndexPath:indexPath animated:YES];
więc flashuje wybrany stan i przywraca.
Jeśli ktoś potrzebuje odpowiedzi na Swift :
cell.selectionStyle = .None
Tego używam, cellForRowAtIndexPath
pisząc ten kod .:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Z UITableViewDelegate
protokołu możesz skorzystać z metody, willSelectRowAtIndexPath
a return nil
jeśli nie chcesz, aby wiersz był zaznaczony.
W ten sam sposób możesz użyć willDeselectRowAtIndexPath
metody i return nil
jeśli nie chcesz, aby wiersz się odznaczył.
1- Wszystko, co musisz zrobić, to ustawić styl selekcji naUITableViewCell
instancji za pomocą:
Cel C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
lub
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3:
cell.selectionStyle = .none
2 - Nie implementuj - tableView:didSelectRowAtIndexPath:
w widoku tabeli delegate
lub jawnie wyklucz komórki, których nie chcesz wykonywać, jeśli je wykonasz.
3 - Co więcej, możesz to zrobić również z serii ujęć. Kliknij komórkę widoku tabeli iw Inspektorze atrybutów w obszarze Komórka widoku tabeli zmień menu rozwijane obok opcji Wybór na Brak.
4 - Możesz wyłączyć podświetlenie komórki tabeli za pomocą poniższego kodu w (iOS) Xcode 9, Swift 4.0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
Poniżej fragmentu wyłącz podświetlanie, ale także wyłącz połączenie z didSelectRowAtIndexPath
. Więc jeśli nie wdrażasz, didSelectRowAtIndexPath
użyj poniższej metody. Należy to dodać podczas tworzenia tabeli. Działa to jednak na przyciskach i UITextField
wewnątrz komórki.
self.tableView.allowsSelection = NO;
Poniżej fragmentu wyłącz wyróżnianie i nie wyłącza połączenia z didSelectRowAtIndexPath
. Ustaw styl wyboru komórki na Brak wcellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Poniżej fragmentu wyłącz wszystko w komórce. Spowoduje to wyłączenie do interakcji buttons
, textfields
:
self.tableView.userInteractionEnabled = false;
Poniżej znajdują się Swift
odpowiedniki powyższych Objective-C
rozwiązań:
Zastąpienie pierwszego rozwiązania
self.tableView.allowsSelection = false
Zastąpienie drugiego rozwiązania
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Zastąpienie trzeciego rozwiązania
self.tableView.userInteractionEnabled = false
Spróbuj wpisać:
cell.selected = NO;
W razie potrzeby usunie zaznaczenie wiersza.
W Swift3 ...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let r = indexPath.row
print("clicked .. \(r)")
tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}
Walczyłem też z tym dość obficie, kontrolując moje UITableViewCell
zabronione korzystanie z userInteractionEnabled
nieruchomości. Mam 3-statyczną tabelę statyczną dla ustawień, 2 z datami, 1 z włącznikiem / wyłącznikiem. Po pobawieniu się w Storyboard / IB udało mi się sprawić, że dolnego nie da się wybrać, ale kiedy go dotkniesz, zniknie wybór z jednego z górnych wierszy. Oto obraz WIP moich ustawień UITableView:
Jeśli dotkniesz trzeciego rzędu, nic się nie stanie, wybór pozostanie w drugim rzędzie. Funkcjonalność jest praktycznie kopią ekranu wyboru dodawania czasu wydarzenia w aplikacji Apple's Calendar.
Kod jest zaskakująco kompatybilny, aż do IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
Działa to w połączeniu z ustawieniem stylu wyboru na none, dzięki czemu komórka nie miga w przypadku zdarzeń przyziemienia
Musisz tylko wstawić ten kod do cellForRowAtIndexPath
Aby wyłączyć właściwość wyboru komórki: (Podczas stukania komórki).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Korzystam z tego, co działa dla mnie.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Chociaż jest to najlepsze i najłatwiejsze rozwiązanie, aby zapobiec wyświetlaniu podświetlenia w wierszu podczas wyboru
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Chciałbym również zasugerować, że czasami przydatne jest krótkie pokazanie, że wiersz został wybrany, a następnie wyłączenie go. Powiadomi to użytkowników o tym, co zamierzali wybrać:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Możesz także ustawić kolor tła na Wyczyść, aby uzyskać taki sam efekt, jak UITableViewCellSelectionStyleNone
w przypadku, gdy nie chcesz / nie możesz użyć UITableViewCellSelectionStyleNone
.
Użyłbyś kodu w następujący sposób:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Może to obniżyć wydajność, ponieważ dodasz do każdej komórki dodatkowy kolorowy widok .
Możesz użyć :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
w komórce dla metody wiersza przy ścieżce indeksu w UITableView.
Możesz także użyć:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
w widoku tabeli didselectrowatindexpath metoda.
cell.selectionStyle = UITableViewCellSelectionStyle.none
w Swift 3.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Miłego kodowania !!!
selection
i oczywiściehighlighting
zostaje z tym wyłączony. Wiele wysoko głosowanych odpowiedzi wyjaśnia, jakdisable selection
rozwiązać problem wyłączaniahighlighting
. Aby wyłączyć tylko podświetlanie, użyjcell.selectionStyle = .None
lub przejdź dostoryboard / cell / Selection = None