UITableView Festlegen einiger Zellen als "nicht auswählbar"

109

Wie kann ich festlegen, dass die Zelleigenschaft von UITableView nicht auswählbar ist? Ich möchte dieses blaue Auswahlfeld nicht sehen, wenn der Benutzer auf die Zelle tippt.

Mugunth
quelle
4
Beachten Sie die jüngsten Googler: Der Weg, dies ab iOS 6 und höher zu tun, ist tableView:shouldHighlightRowAtIndexPath:wie von Ayush unten angegeben
jemmons

Antworten:

151

Setzen Sie die selectionStyleEigenschaft der Tabellenzelle auf UITableViewCellSelectionStyleNone. Das sollte verhindern, dass es hervorgehoben wird, und Sie können diese Eigenschaft auch in Ihrem überprüfen tableView:didSelectRowAtIndexPath:.

Daniel Dickison
quelle
3
Kendall hat recht. Folgen Sie der Antwort von Sebastian Celis, um zu verhindern, dass didSelectRowAtIndexPath überhaupt aufgerufen wird. Sie sollten jedoch auch selectionStyle festlegen, um das Hervorheben zu verhindern.
Daniel Dickison
Ja, ich nehme an, die Antwort von Sebastian Celis ist die richtige Antwort, danke Daniel
LolaRun
1
Storyboard - Fans statische Tableviews Verwendung eines UITableViewCell auswählen und unter Attribute Inspector das finden Auswahlfeld und setzen Sie ihn auf None
Manuel BM
196

So verhindern Sie die Zeilenauswahl

Um die Auswahl der vollständig zu verhindern UITableViewCell, haben Sie Ihr UITableViewDelegateGerät tableView:willSelectRowAtIndexPath:. Von dieser Methode können Sie zurückkehren, nilwenn Sie nicht möchten, dass die Zeile ausgewählt wird.

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

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

Dies verhindert, dass die Zeile ausgewählt und tableView:didSelectRowAtIndexPath:aufgerufen wird. Beachten Sie jedoch, dass dies nicht verhindert , dass die Zeile hervorgehoben wird.

So verhindern Sie das Hervorheben von Zeilen

Wenn Sie verhindern möchten, dass die Zeile bei Berührung visuell hervorgehoben wird, können Sie sicherstellen, dass die Zelle auf eingestellt selectionStyleist UITableViewCellSelectionStyleNone, oder Sie können Ihr UITableViewDelegateGerät vorzugsweise tableView:shouldHighlightRowAtIndexPath:wie folgt einrichten :

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

    return rowIsSelectable;
}
Sebastian Celis
quelle
1
Vielen Dank! Genau das, was ich brauchte.
Buchannon
10
Dies sollte meiner Meinung nach die akzeptierte Antwort sein. Es behebt das Problem tatsächlich, anstatt es zu maskieren.
Tovi7
4
Beachten Sie, dass tableView: willSelectRowAtIndexPath: nach dem Hervorheben der Zelle aufgerufen wird, was zu einem Flimmern führt. Aus Apples Beschreibung: Diese Methode wird erst aufgerufen, wenn Benutzer eine Zeile berühren und dann ihren Finger heben. Die Zeile wird bis dahin nicht ausgewählt, obwohl sie beim Aufsetzen hervorgehoben wird.
Daniel
5
Ich stimme @simpleBob zu. Um diese Lösung verwenden zu können, müssen Sie cell.selectionStyle in den nicht auswählbaren Zeilen auf UITableViewCellSelectionStyleNone setzen. Ansonsten sieht es klebrig aus.
Kyle Clegg
Dann ist die beste Antwort immer noch die akzeptierte Antwort. Sie können einfach wählen, nichts zu tun, didSelectRowAtIndexPathda willSelectRowAtIndexPathes sowieso immer aufgerufen wird.
Matthew Quiros
16

benutze das:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
hanumanDev
quelle
5
Das verhindert nur, dass die Auswahlfarbe angezeigt wird, didSelectRowAtIndexPathwird immer noch aufgerufen.
Zekel
Dies ist auch genau die gleiche Antwort wie die von Daniel Dickison auf diese Frage.
Swift 2.2 UPDATE - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com
11

Nur für iOS 6+.

Sie können die Methode tableView:shouldHighlightRowAtIndexPath:in Ihrem Delegaten implementieren . Lesen Sie hier mehr: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html

Ayush Goel
quelle
3
Sollte weit mehr Stimmen haben. Dies ist die richtige Antwort. Wenn Sie den Auswahlstil ändern, sodass Sie nicht sehen können, dass eine Zelle ausgewählt ist, die Benutzerinteraktion deaktivieren, damit Sie nicht auf eine Zelle tippen können, oder die Auswahl von Zellen bei der Auswahl deaktivieren, handelt es sich um Hacks.
Stuart Campbell
9

Hatte auch dieses Problem alles schon Erwähnte ausprobiert. Der letzte Trick, der den "blauen Blitz" bei der Auswahl einer Tabellenzelle beseitigte, war das Hinzufügen dieser Zeile:

self.myTableView.allowsSelection = NO;

Ich bin mir nicht sicher, ob es diese eine Zeile oder alles zusammen war, aber als Gesamtergebnis bekomme ich keine blaue Auswahl oder sogar den blauen Blitz mehr. Glücklich!

JOM
quelle
1
Das Problem dabei ist, dass dadurch nicht alle Zellen in der Tabellenansicht ausgewählt werden können. Wenn Sie möchten, dass eine Zelle auswählbar ist und andere nicht auswählbar sind, reicht dies nicht aus. Sebastians Ansatz hat bei mir funktioniert.
Terry
True, allowSelection = NO deaktiviert die Auswahl für alle Zellen.
JOM
1
Gibt es in Interface Builder eine entsprechende Eigenschaft für diese Eigenschaft?
Chrish
8

einstellen cell.userInteractionEnabled = NO;

Rob Bonner
quelle
Warten Sie, machen Sie es so. Art von. Machen Sie 'FALSE' in Kleinbuchstaben und verlieren Sie dieses verrückte Semikolon. Das wird es für Sie schnell gehen. 'FALSE' war böse und falsch, jetzt ist 'NO' böse und falsch. Bis nächste Woche, wenn 'falsch' böse und falsch ist, mach es so.
HalR
5

Die Verwendung von IB ist auch eine elegante Methode:

Geben Sie hier die Bildbeschreibung ein

Brian
quelle
3

Apple sagt, dass Sie in didSelectRowAtIndexPath als erstes die Auswahl der Zeile aufheben sollten

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

Anschließend können Sie den AccessoryType in ein Häkchen oder keines usw. ändern. Wenn Sie also didSelectRowAtIndexPath eingeben, können Sie die Auswahl der Zeile aufheben. Wenn diese nicht ausgewählt werden soll, aktivieren Sie diese Zeile einfach nicht.

Programmierhandbuch für die Tabellenansicht

Ryanday
quelle
1
Wenn ein Benutzer die Zelle berührt, wird sie in diesem Fall für kurze Zeit hervorgehoben und dann nicht hervorgehoben. Soweit ich weiß, geht es jedoch darum, die Hervorhebung vollständig zu verhindern.
Kuba Suder
3

Eine andere Möglichkeit besteht darin, ein paar Kategoriemethoden hinzuzufügen UITableViewCell. Ich mag diese Antwort besser als Sebastians (auch gute) Antwort, weil ich meinen Tisch so baue. Ich dachte, es könnte jemand anderem hilfreich sein.

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

- (BOOL)isSelectable {
    BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
                     [self isUserInteractionEnabled];
    return ! disabled;
}
zekel
quelle
3

Swift 4:
Sie können die Auswahl und Hervorhebung mithilfe von UITableViewDelegate verhindern: shouldHighlightRowAt Bei

dieser Antwort wird davon ausgegangen,
dass Sie eine benutzerdefinierte Zelle mit dem Namen CustomTableViewCell erstellt haben und dass Sie in dieser benutzerdefinierten Zelle mit dem Namen isSelectable einen Booleschen Wert erstellt haben

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
    }
}

Dies ist die Swift-Version von Sebastian Celis 'objc Antwort.

Chase McElroy
quelle
1

Wenn Sie Ihre Zelle in Interface Builder entworfen haben, können Sie dies tun, indem Sie das Kontrollkästchen unter " Benutzerinteraktion aktiviert " für das entfernen tableViewCell.

Jay
quelle
0

Es gibt eine andere einfache Möglichkeit, um zu vermeiden, dass die Auswahl blau angezeigt wird.

Wählen Sie eine Zelle aus, die nicht blau angezeigt werden soll.

Wählen Sie dann den Attributinspektor aus (das Schildsymbol neben dem Linealsymbol in der Eigenschaftenansicht auf der Seite).

Ändern Sie dann das Feld "Auswahl" von "Blau" in "Keine".

Beachten Sie, dass dies vermutlich immer noch ausgewählt wird. Es wird nur nicht als ausgewählt angezeigt, wenn Sie nur den UI-Effekt vermeiden möchten.

sien
quelle
0

Verwenden Sie tableView: willDisplayCell: forRowAtIndexPath: anstelle von tableView: didSelectRowAtIndexPath:, um den Blitz zu entfernen, der beim ersten Berühren der Zelle angezeigt wird.

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
user3164248
quelle
0

Um bestimmte Zeilen nicht auszuwählen, müssen Sie einige Änderungen an zwei Methoden des UITableView-Delegaten vornehmen.

In der folgenden Methode

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

Schreiben Sie nach der Zuweisung der Zelle den folgenden Code

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

Der obige Code verhindert das Hervorheben der Zelle, wenn der Benutzer versucht, eine Auswahl zu treffen.

in dieser Delegate-Methode unten

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

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

Wenn Sie nicht schreiben, wird die if(indexPath.row == someCellNumber) return;Zeile weiterhin ausgewählt und es besteht die Möglichkeit eines App-Absturzes

Dipu Rajak
quelle
0

Swift 4:

In der Zellklasse:

selectionStyle = .none
Eden
quelle
0

Swift 5

cell.isUserInteractionEnabled = false
S. Mert
quelle