Jak Mogę wyłączyć wybór UITableView?
Po dotknięciu wiersza w UITableView
wiersz jest podświetlony i zaznaczony. Czy można to wyłączyć, aby stukanie w wiersz nic nie dało?
30 answers
Dla mnie, następujące działa dobrze:
tableView.allowsSelection = NO;
To znaczy didSelectRowAt#
po prostu nie zadziała. Oznacza to, że dotknięcie rzędu stołu jako takiego nie zrobi absolutnie nic. (A więc oczywiście nigdy nie będzie wybranej-animacji.)
(zauważ, że jeśli na komórkach masz UIButton
lub jakiekolwiek inne kontrolki, oczywiście te kontrolki nadal będą działać. Wszelkie kontrolki, które masz na komórce tabeli, są całkowicie niezwiązane ze zdolnością UITableView pozwalającą " wybrać wiersz " używając didSelectRowAt#
.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-25 19:11:27
Wszystko, co musisz zrobić, to ustawić styl zaznaczenia na instancji UITableViewCell
używając:
Objective-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 zaimplementujesz -tableView:didSelectRowAtIndexPath:
w delegacie widoku tabeli, albo wyraźnie wyklucz komórki, które mają nie mieć akcji, jeśli ją zaimplementujesz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-03 09:33:10
Ponieważ czytałem ten post niedawno i pomógł mi, chciałem dodać 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 żądanej logiki i / lub wyniku:
1.To wyłącz niebieskie podświetlenie bez zmiany jakiejkolwiek innej interakcji komórki:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Używam tego, gdy mam UIButton-lub inną kontrolę(s) - hostowaną w UITableViewCell i chcę użytkownika, aby móc wchodzić w interakcje z kontrolkami, ale nie z samą komórką.
Uwaga: Jak zauważył Tony Million, nie zapobiega to tableView:didSelectRowAtIndexPath:
. Rozumiem to za pomocą prostych stwierdzeń "jeśli", najczęściej testujących dla danej sekcji i unikających działań dla danej sekcji.
Innym sposobem, który pomyślałem, aby przetestować pod kątem stukania komórki takiej jak ta, 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.To zrób to dla całej tabeli, możesz zastosować powyższe rozwiązanie do każdej komórki w tabeli, ale można też to zrobić:
[tableView setAllowsSelection:NO];
w moich testach nadal pozwala to na interaktywne sterowanie wewnątrz UITableViewCell
.
3.To zrób komórkę "tylko do odczytu", możesz po prostu to zrobić:
[cell setUserInteractionEnabled:NO];
4.To Utwórz całą tabelę"tylko do odczytu"
[tableView setUserInteractionEnabled:NO];
5.To określ w locie, czy podświetlić komórkę (co zgodnie z ta odpowiedź domyślnie zawiera zaznaczenie), możesz zaimplementować następująca metoda protokołu UITableViewDelegate
:
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:30
Podsumowując to, co uważam za poprawne odpowiedzi oparte na moim własnym doświadczeniu w realizacji tego:
Jeśli chcesz wyłączyć zaznaczanie tylko dla niektórych komórek, użyj:
cell.userInteractionEnabled = NO;
Oprócz zapobiegania zaznaczeniu, zatrzymuje to również wywołanie tableView:didSelectRowAtIndexPath: dla komórek, które go ustawiły. (Kredyt idzie do Tony Million za tę odpowiedź, dzięki!)
Jeśli masz w komórkach przyciski, które trzeba kliknąć, musisz zamiast tego:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Oraz musisz również zignorować wszelkie kliknięcia na komórkę w - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.
Jeśli chcesz wyłączyć zaznaczenie dla całej tabeli, użyj:
tableView.allowsSelection = NO;
(Podziękowania dla Paulo De Barros, dzięki!)Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-07 08:45:25
Od wersji iOS 6.0, UITableViewDelegate
mA tableView:shouldHighlightRowAtIndexPath:
. (Przeczytaj o tym w dokumentacji iOS .)
Ta metoda pozwala oznaczyć określone wiersze jako niewykrywalne (i domyślnie niewykrywalne) bez konieczności zmiany stylu zaznaczenia komórki, mieszania w obsłudze zdarzeń komórki za pomocą userInteractionEnabled = NO
lub innych udokumentowanych tutaj technik.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-31 21:48:47
Możesz również wyłączyć wybór wiersza z samego konstruktora interfejsu, wybierając NoSelection
z opcji selection
(właściwości UITableView) w panelu Inspektora, jak pokazano na poniższym obrazku
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-09 05:46:38
ROZWIĄZANIE STAŁE DLA SWIFT 3
cell.selectionStyle = .none
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 19:37:39
W przypadku, gdy ktoś potrzebuje odpowiedzi na Swift :
cell.selectionStyle = .None
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-02 09:39:43
Jeśli chcesz, aby selekcja migała tylko, a nie pozostała w wybranym stanie, możesz wywołać w
didSelectRowAtIndexPath
Następujące
[tableView deselectRowAtIndexPath:indexPath animated:YES];
Więc będzie migać wybrany stan i powróci.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-13 15:07:34
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-05 07:49:18
Z protokołu UITableViewDelegate
można użyć metody willSelectRowAtIndexPath
i return nil
jeśli nie chcesz, aby wiersz został wybrany.
W ten sam sposób można użyć metody willDeselectRowAtIndexPath
i return nil
, jeśli nie chcesz, aby wiersz odznaczył zaznaczenie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-29 05:57:23
Tego używam:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
W cellForRowAtIndexPath wpisz ten kod.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-30 10:31:58
Spróbuj wpisać:
cell.selected = NO;
W razie potrzeby usunie zaznaczenie twojego 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)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-29 22:48:01
Objective-C:
-
Poniżej fragment wyłącza podświetlanie, ale wyłącza również wywołanie do
didSelectRowAtIndexPath
. Jeśli więc nie implementujeszdidSelectRowAtIndexPath
, użyj poniższej metody. Należy to dodać podczas tworzenia tabeli. Będzie to działać na przyciskach iUITextField
wewnątrz komórki.self.tableView.allowsSelection = NO;
-
Poniżej fragment wyłącza podświetlanie i nie wyłącza wywołania do
didSelectRowAtIndexPath
. Ustaw styl zaznaczenia komórki na None wcellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
-
Poniżej snippet Wyłącz wszystko w komórce. Spowoduje to wyłączenie interakcji z
buttons
,textfields
:self.tableView.userInteractionEnabled = false;
Swift:
Poniżej znajdują się Swift
odpowiedniki powyższych Objective-C
rozwiązań:
-
Wymiana pierwszego roztworu
self.tableView.allowsSelection = false
-
Wymiana drugiego roztworu
cell?.selectionStyle = UITableViewCellSelectionStyle.None
-
Zastąpienie trzeciego roztworu
self.tableView.userInteractionEnabled = false
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-28 16:44:27
Ja też walczyłem z tym dość obficie, posiadając kontrolę w moim UITableViewCell
zabraniającym używania userInteractionEnabled
własności. Mam statyczną tabelę 3 komórek dla ustawień, 2 z datami, 1 z włącznikiem / wyłącznikiem. Po zabawie w Storyboard/IB udało mi się zrobić dolny nie do wyboru, ale po dotknięciu go wybór z jednego z górnych wierszy znika. Oto obraz WIP moich ustawień UITableView:
Jeśli dotkniesz trzeciego rzędu nic się nie dzieje, wybór pozostanie w drugim rzędzie. Funkcjonalność jest praktycznie kopią ekranu wyboru czasu wydarzenia aplikacji kalendarza Apple.
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 zaznaczenia na brak, więc komórka nie migocze przy zdarzeniach dotykowych
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-03 21:15:01
Do szybkiego dezelekcji
cell.selectionStyle = .None
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 11:37:52
Możemy napisać kod jak
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Ale gdy mamy własną Komórkę xib powyżej linii dać ostrzeżenie w tym czasie dla
Custom cell xib
Musimy ustawić styl wyboru None z konstruktora interfejsu
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-24 13:21:09
Wystarczy umieścić ten kod w cellForRowAtIndexPath
Aby wyłączyć właściwość wyboru komórki: (podczas stukania komórki).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-18 05:17:24
Spróbuj tego
cell.selectionStyle = UITableViewCellSelectionStyleNone;
I
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
I możesz również ustawić styl zaznaczenia za pomocą interfejsu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-12 10:41:15
Używam tego, co działa na mnie.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-19 16:03:19
Chociaż jest to najlepsze i najłatwiejsze rozwiązanie, aby zapobiec wyświetlaniu podświetlenia w wierszu podczas zaznaczania
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. To ostrzega użytkowników z potwierdzeniem, co zamierzali wybrać:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-20 21:25:24
Możesz również ustawić kolor tła na Wyczyść, aby uzyskać taki sam efekt jak UITableViewCellSelectionStyleNone
, jeśli nie chcesz / nie możesz użyć UITableViewCellSelectionStyleNone
.
Możesz użyć kodu w następujący sposób:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
To może degradacja twoja wydajność jako dodanie dodatkowego kolorowego widoku do każdej komórki.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-14 01:43:02
Aby wyłączyć podświetlanie UItableviewcell
cell.selectionStyle = UITableViewCellSelectionStyleNone;
I nie powinny pozwolić użytkownikowi na interakcję z komórką.
cell.userInteractionEnabled = NO;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-18 00:51:00
Możesz użyć tego
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-10 09:44:26
Możesz użyć ....
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-08 11:10:34
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-01 06:21:50
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Szczęśliwego kodowania !!!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-24 06:39:05
Można to również zrobić z storyboardu. Kliknij komórkę widoku tabeli i w Inspektorze atrybutów pod komórką widoku tabeli Zmień listę rozwijaną obok zaznaczenia na brak.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-04 05:12:56
Swift Solution w / Custom Cell:
import Foundation
class CustomTableViewCell: UITableViewCell
{
required init(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
{
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.selectionStyle = UITableViewCellSelectionStyle.None
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 08:54:28
Możesz użyć selectionStyle właściwości UITableViewCell
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Lub
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Również nie implementuj poniżej delegata
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }
Jeśli utworzyłeś plik Xib / Storyboard, możesz zmienić setUserInteractionEnabled właściwość tableview na No {[5] } przez odznaczenie jej. Spowoduje to, że widok tableview będzie tylko do odczytu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-15 08:55:20