UITableView Ustawianie niektórych komórek jako „niewybieralnych”

109

Jak ustawić właściwość komórki UITableView tak, aby nie można było jej wybierać? Nie chcę widzieć tego niebieskiego pola wyboru, gdy użytkownik dotyka komórki.

Mugunth
źródło
4
Uwaga najnowsze Googlersom: Sposób to zrobić jak iOS 6 i większa jest tableView:shouldHighlightRowAtIndexPath:jak zauważył Ayush poniżej
jemmons

Odpowiedzi:

151

Ustaw właściwość komórki tabeli selectionStylena UITableViewCellSelectionStyleNone. Powinno to uniemożliwić jego podświetlenie. Możesz również sprawdzić tę właściwość w swoim tableView:didSelectRowAtIndexPath:.

Daniel Dickison
źródło
3
Kendall ma rację. Postępuj zgodnie z odpowiedzią Sebastiana Celisa, aby w pierwszej kolejności zapobiec wywołaniu didSelectRowAtIndexPath. Powinieneś jednak także ustawić selectionStyle, aby zapobiec podświetlaniu.
Daniel Dickison,
tak, przypuszczam, że odpowiedź Sebastiana
Celisa
1
Fani scenorysów używający statycznych TableViews mogą wybrać UITableViewCell, a pod Inspektorem atrybutów mogą znaleźć pole wyboru i ustawić je na Brak
Manuel BM
197

Aby zapobiec zaznaczaniu wierszy

Aby całkowicie uniemożliwić wybór UITableViewCell, oddaj swoje UITableViewDelegatenarzędzie tableView:willSelectRowAtIndexPath:. Z tej metody możesz powrócić, niljeśli nie chcesz, aby wiersz był zaznaczony.

- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
    // Determine if row is selectable based on the NSIndexPath.

    if (rowIsSelectable) {
        return path;
    }
    return nil;
}

Zapobiega to wybieraniu i tableView:didSelectRowAtIndexPath:wywoływaniu wiersza . Należy jednak pamiętać, że nie zapobiega to podświetleniu wiersza.

Aby zapobiec podświetlaniu wierszy

Jeśli chcesz zapobiec wizualnemu podświetlaniu wiersza po dotknięciu, możesz upewnić się, że komórka selectionStylejest ustawiona na UITableViewCellSelectionStyleNone, lub najlepiej możesz mieć swoje UITableViewDelegatenarzędzie tableView:shouldHighlightRowAtIndexPath:w następujący sposób:

- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Determine if row is selectable based on the NSIndexPath.

    return rowIsSelectable;
}
Sebastian Celis
źródło
1
Dzięki! Dokładnie to, czego potrzebowałem.
Buchannon
10
Moim zdaniem powinna to być akceptowana odpowiedź. W rzeczywistości rozwiązuje problem zamiast go maskować.
Tovi7
4
Zauważ, że tableView: willSelectRowAtIndexPath: jest wywoływana po podświetleniu komórki, co spowoduje migotanie. Z opisu firmy Apple: Ta metoda nie jest wywoływana, dopóki użytkownik nie dotknie wiersza, a następnie nie podniesie palca; wiersz nie jest zaznaczony do tego czasu, chociaż jest podświetlony po przyłożeniu.
Daniel
5
Zgadzam się z @simpleBob. Aby skorzystać z tego rozwiązania, musisz również ustawić cell.selectionStyle na UITableViewCellSelectionStyleNone w wierszach, których nie można wybrać. W przeciwnym razie wygląda tandetnie.
Kyle Clegg
Wtedy najlepszą odpowiedzią jest nadal akceptowana odpowiedź. Możesz po prostu zdecydować się nic nie robić, didSelectRowAtIndexPathponieważ i willSelectRowAtIndexPathtak zawsze zostanie wezwany.
Matthew Quiros,
16

Użyj tego:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
hanumanDev
źródło
5
To tylko zatrzymuje wyświetlanie koloru zaznaczenia, didSelectRowAtIndexPathjest nadal wywoływane.
zekel
Jest to również dokładnie ta sama odpowiedź, co Daniel Dickison na to pytanie.
AKTUALIZACJA Swift 2.2 - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com
11

Tylko dla iOS 6+.

Możesz zaimplementować metodę tableView:shouldHighlightRowAtIndexPath:w swoim delegacie. Przeczytaj więcej tutaj: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html

Ayush Goel
źródło
3
Powinien mieć znacznie więcej głosów pozytywnych. To jest prawidłowa odpowiedź, zmiana stylu zaznaczania, aby komórka nie była zaznaczona, wyłączenie interakcji użytkownika, aby nie można było dotknąć komórki, lub odznaczenie komórek przy zaznaczeniu to hacki.
Stuart Campbell
9

Miałem też ten problem, wypróbowałem wszystko już wspomniane. Ostatnią sztuczką, która pozwoliła pozbyć się „niebieskiego błysku” przy wybieraniu komórki tabeli, było dodanie tej linii:

self.myTableView.allowsSelection = NO;

Nie jestem pewien, czy to była ta jedna linia, czy wszystko razem, ale w sumie wielki wynik nie ma już niebieskiego zaznaczenia ani nawet niebieskiego błysku. Szczęśliwy!

JOM
źródło
1
Problem polega na tym, że powoduje to, że nie można wybrać wszystkich komórek w widoku tabeli. Jeśli chcesz, aby można było wybrać jakąś komórkę, a innych nie, to nie wystarczy. Podejście Sebastiana zadziałało dla mnie.
Terry
True, allowSelection = NO wyłączy zaznaczanie dla wszystkich komórek.
JOM
1
Czy istnieje równoważna właściwość w programie Interface Builder dla tej właściwości?
chrish
8

Zestaw cell.userInteractionEnabled = NO;

Rob Bonner
źródło
Poczekaj, zrób to w ten sposób. Raczej. uczyń „FALSE” małymi literami i zgub ten szalony średnik. To przyspieszy to dla ciebie. „FALSE” było złe i złe, teraz „NIE” jest złe i złe. Aż do przyszłego tygodnia, kiedy „fałsz” jest zły, a zły, rób to w ten sposób.
HalR
5

używanie IB to także elegancki sposób:

wprowadź opis obrazu tutaj

Brian
źródło
3

Apple mówi, że pierwszą rzeczą, którą powinieneś zrobić w didSelectRowAtIndexPath, jest odznaczenie wiersza

[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];

Następnie możesz zmienić AccessoryType na znacznik wyboru lub brak, itd. Więc kiedy wpiszesz didSelectRowAtIndexPath, możesz odznaczyć wiersz, a jeśli nie ma być zaznaczony, po prostu nie zaznaczaj tego wiersza.

Przewodnik programowania w widoku tabelarycznym

ryanday
źródło
1
W takim przypadku, gdy użytkownik dotknie komórki, zostanie ona na krótko podświetlona, ​​a następnie wyłączona - ale jak rozumiem, chodzi o to, aby całkowicie zatrzymać jej podświetlenie.
Kuba Suder
3

Innym sposobem jest dodanie kilku metod kategorii do UITableViewCell. Podoba mi się to bardziej niż odpowiedź Sebastiana (również dobra), ponieważ sposób w jaki buduję swój stół. Pomyślałem, że to może być pomocne dla kogoś innego.

- (void)setSelectable:(BOOL)enabled {
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
    [self setUserInteractionEnabled:enabled];
}

- (BOOL)isSelectable {
    BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
                     [self isUserInteractionEnabled];
    return ! disabled;
}
zekel
źródło
3

Swift 4:
Możesz uniemożliwić zaznaczanie i podświetlanie, używając UITableViewDelegate: shouldHighlightRowAt

Ta odpowiedź zakłada, że ​​masz utworzoną niestandardową komórkę o nazwie: CustomTableViewCell
oraz że utworzyłeś wartość logiczną wewnątrz tej niestandardowej komórki o nazwie: isSelectable

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
    if cell.isSelectable == false {
        return false
    } else {
        return true
    }
}

To jest wersja Swift objc odpowiedzi Sebastiana Celisa.

Chase McElroy
źródło
1

Jeśli zaprojektowałeś swoją komórkę w Interface Builder, możesz to zrobić, usuwając pole wyboru „ Włączono interakcję użytkownika ” dla tableViewCell.

Sójka
źródło
0

Jest jeszcze jeden prosty sposób na uniknięcie wyświetlania zaznaczenia na niebiesko.

Wybierz komórkę, której nie chcesz, aby była niebieska.

Następnie wybierz inspektora atrybutów (ikona tarczy obok ikony linijki w widoku właściwości z boku).

Następnie zmień pole „Wybór” z „Niebieskiego” na „Brak”.

Uwaga, prawdopodobnie nadal trwa wybieranie, po prostu nie będzie wyświetlane jako wybrane, jeśli chcesz tylko uniknąć efektu interfejsu użytkownika.

sien
źródło
0

Użyj tableView: willDisplayCell: forRowAtIndexPath: zamiast tableView: didSelectRowAtIndexPath: aby pozbyć się flasha, który pojawia się po pierwszym dotknięciu komórki.

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
user3164248
źródło
0

Aby wyłączyć zaznaczenie określonego wiersza, musisz wprowadzić pewne zmiany w dwóch metodach delegata UITableView.

W metodzie poniżej

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

po przydzieleniu komórki napisz poniższy kod

if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;

Powyższy kod zapobiegnie podświetleniu komórki, jeśli w jakiś sposób użytkownik spróbuje zaznaczyć.

w tej metodzie delegata poniżej

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if(indexPath.row == someCellNumber) return;

    //for other cells write the code below...
}

jeśli nie napiszesz, if(indexPath.row == someCellNumber) return;wiersz nadal będzie zaznaczony i istnieje ryzyko awarii aplikacji

Dipu Rajak
źródło
0

Swift 4:

W klasie komórkowej:

selectionStyle = .none
eden
źródło
0

Szybki 5

cell.isUserInteractionEnabled = false
S. Mert
źródło