it-swarm.com.de

UITableview: Deaktivieren der Auswahl für einige Zeilen, jedoch nicht für andere

Ich zeige in einer Gruppe tableview Inhalte an, die aus XML analysiert wurden. Ich möchte das Klickereignis darauf deaktivieren (es sollte überhaupt nicht möglich sein, darauf zu klicken). Die Tabelle enthält zwei Gruppen. Ich möchte die Auswahl nur für die erste Gruppe deaktivieren, aber nicht für die zweite Gruppe. Klicken Sie auf die erste Zeile der zweiten Gruppe navigates zu meiner Tube player view.

Wie kann ich nur bestimmte Gruppen oder Zeilen auswählbar machen?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if(indexPath.section!=0)
    if(indexPath.row==0)    

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]];   
}

Vielen Dank.

279
Warrior

Sie müssen diesen Code nur in cellForRowAtIndexPath einfügen

So deaktivieren Sie die Auswahleigenschaft der Zelle: (während Sie auf die Zelle tippen)

cell.selectionStyle = UITableViewCellSelectionStyleNone;

So aktivieren Sie das Auswählen (Tippen) der Zelle: (Tippen auf die Zelle)

// Default style
cell.selectionStyle = UITableViewCellSelectionStyleBlue;

// Gray style
cell.selectionStyle = UITableViewCellSelectionStyleGray;

Beachten Sie, dass eine Zelle mit selectionStyle = UITableViewCellSelectionStyleNone; bewirkt weiterhin, dass die Benutzeroberfläche didSelectRowAtIndexPath aufruft, wenn sie vom Benutzer berührt wird. Um dies zu vermeiden, gehen Sie wie unten vorgeschlagen vor und stellen Sie ein.

cell.userInteractionEnabled = NO;

stattdessen. Beachten Sie auch, dass Sie cell.textLabel.enabled = NO;, um das Objekt auszublenden.

476
Pugal

Wenn Sie eine Zeile (oder eine Teilmenge von Zeilen) erstellen möchten nicht auswählbar, implementieren Sie die UITableViewDelegate -Methode -tableView:willSelectRowAtIndexPath: (auch von TechZen erwähnt). Wenn das indexPath nicht auswählbar sein soll, geben Sie nil zurück, andernfalls das indexPath. Um das Standardauswahlverhalten zu erhalten, geben Sie einfach das indexPath zurück, das an Ihre delegate -Methode übergeben wurde. Sie können die Zeilenauswahl jedoch auch ändern, indem Sie ein anderes indexPath zurückgeben.

beispiel:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // rows in section 0 should not be selectable
    if ( indexPath.section == 0 ) return nil;

    // first 3 rows in any section should not be selectable
    if ( indexPath.row <= 2 ) return nil;

    // By default, allow row to be selected
    return indexPath;
}
348
Brian Chapados

Ab iOS 6 können Sie verwenden

-tableView:shouldHighLightRowAtIndexPath:

Wenn Sie NO zurückgeben, werden sowohl die Auswahlhervorhebung als auch die vom Storyboard ausgelösten Segmente deaktiviert, die mit dieser Zelle verbunden sind.

Die Methode wird aufgerufen, wenn eine Zeile berührt wird. Wenn Sie zu dieser Meldung NO zurückkehren, wird der Auswahlprozess angehalten, und die aktuell ausgewählte Zeile verliert nicht ihr ausgewähltes Aussehen, während die Berührung gedrückt wird.

ITableViewDelegate-Protokollreferenz

55
Keller

Keiner der obigen Antworten spricht das Problem wirklich richtig an. Der Grund ist, dass wir die Auswahl der Zelle deaktivieren möchten, aber nicht unbedingt der Unteransichten innerhalb der Zelle.

In meinem Fall präsentierte ich einen UISwitch in der Mitte der Zeile und ich wollte die Auswahl für den Rest der Zeile (der leer ist) deaktivieren, aber nicht für den Switch! Die richtige Art, dies zu tun, liegt daher in der Methode

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

wo eine Aussage des Formulars

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

deaktiviert die Auswahl für die bestimmte Zelle, während der Benutzer gleichzeitig den Schalter manipulieren und den entsprechenden Selektor verwenden kann. Dies ist nicht der Fall, wenn jemand die Benutzerinteraktion über deaktiviert

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

methode, die lediglich die Zelle vorbereitet und keine Interaktion mit dem UISwitch zulässt.

Darüber hinaus mit der Methode

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

um die Auswahl der Zelle mit einer Anweisung des Formulars aufzuheben

[tableView deselectRowAtIndexPath:indexPath animated:NO];

zeigt weiterhin die ausgewählte Zeile an, während der Benutzer auf die ursprüngliche Inhaltsansicht der Zelle drückt.

Nur meine zwei Cent. Ich bin mir ziemlich sicher, dass viele dies nützlich finden werden.

16
MightyMouse

Sie fangen Auswahlen mit diesen Datenquellenmethoden ab.

– tableView:willSelectRowAtIndexPath: 
– tableView:didSelectRowAtIndexPath: 
– tableView:willDeselectRowAtIndexPath: 
– tableView:didDeselectRowAtIndexPath:

Bei diesen Methoden prüfen Sie, ob es sich bei der ausgewählten Zeile um eine Zeile handelt, die Sie auswählen möchten. Wenn dies der Fall ist, führen Sie eine Aktion aus. Wenn nicht, tun Sie nichts.

Leider können Sie die Auswahl nicht für nur einen Abschnitt deaktivieren. Es ist der ganze Tisch oder nichts.

Sie können jedoch die Eigenschaft selectionStyle der Tabellenzellen auf UITableViewCellSelectionStyleNone setzen. Ich glaube, das macht die Auswahl unsichtbar. In Kombination mit den oben genannten Methoden sollten die Zellen aus Sicht des Benutzers völlig träge aussehen.

Edit01:

Wenn Sie eine Tabelle haben, in der nur einige der Zeilen auswählbar sind, ist es wichtig, dass sich die Zellen der auswählbaren Zeilen visuell von den nicht auswählbaren Zeilen unterscheiden. Die Chevron-Zubehörschaltfläche ist die Standardmethode dafür.

Wie auch immer Sie es tun, Sie möchten nicht, dass Ihre Benutzer versuchen, Zeilen auszuwählen und denken, die App sei fehlerhaft, weil die Zeile nichts tut.

11
TechZen

Für Swift 4. zum Beispiel:

cell.isUserInteractionEnabled = false
cell.contentView.alpha = 0.5
9

Sie müssen wie folgt vorgehen, um die Zellenauswahl in der cellForRowAtIndexPath -Methode zu deaktivieren:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell setUserInteractionEnabled:NO];

Um die abgeblendete Zelle anzuzeigen, setzen Sie Folgendes in das Feld tableView:WillDisplayCell:forRowAtIndexPath Methode:

[cell setAlpha:0.5];

Mit einer Methode können Sie die Interaktivität steuern, mit der anderen können Sie das Erscheinungsbild der Benutzeroberfläche steuern.

9
azfar

Meine Lösung basiert auf Datenmodell:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
    return rowDetails.enabled ? indexPath : nil
}

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
    return rowDetails.enabled
}
5
SoftDesigner

Um zu verhindern, dass nur einige Zellen ausgewählt werden, gehen Sie wie folgt vor:

cell.userInteractionEnabled = NO;

Dies verhindert nicht nur die Auswahl, sondern verhindert auch, dass tableView: didSelectRowAtIndexPath: für die Zellen aufgerufen wird, für die es festgelegt wurde.

5
JosephH

Du kannst den ... benutzen tableView:willDisplayCell Methode, um alle Arten von Anpassungen an einer tableViewCell vorzunehmen.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
     [cell setUserInteractionEnabled:NO];

     if (indexPath.section == 1 && indexPath.row == 0)
     {
         [cell setSelectionStyle:UITableViewCellSelectionStyleGray];
         [cell setUserInteractionEnabled:YES];
     }
} 

In diesem obigen Code kann der Benutzer nur die erste Zeile im zweiten Abschnitt der Tabellenansicht auswählen. Der Rest aller Zeilen kann nicht ausgewählt werden. Vielen Dank!

4
Abdul Rahman

Für Swift 4.0 Dies wird den Trick tun. Es wird die Zelle in der didSelectRowAtIndexPath-Methode deaktivieren, aber die Unteransichten anklickbar halten.

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
         if (indexPath.row == clickableIndex ) { 
            return indexPath
         }else{
            return nil
        }
    }
4
Nilesh

Für Swift:

cell.selectionStyle = .None
cell.userInteractionEnabled = false
3
Esqarrouth

EINFACHES

Benutz einfach cell.userInteractionEnabled = YES; zur Zelle, wenn sie navigieren kann, und cell.userInteractionEnabled = NO; Andernfalls

1
Rick Royd Aban

Ich fand das praktisch, da es sowohl mit statischen als auch mit dynamischen Tabellen funktioniert. Ich setze das Offenlegungskennzeichen nur für die Zellen, die ausgewählt werden sollen.

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) {
        return nil;
    }
    return indexPath;
}
1
Jeffery Jones

Verwenden Sie dies, um die Zelle sieht aus wie deaktiviert und nicht auswählbar zu machen:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Wichtig: Beachten Sie, dass dies nur eine Stileigenschaft ist und die Zelle nicht deaktiviert. Dazu müssen Sie in Ihrer didSelectRowAtIndexPath: - Delegate-Implementierung nach selectionStyle suchen:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if(cell.selectionStyle == UITableViewCellSelectionStyleNone) {
        return;
    }

    // do your cell selection handling here
}
1
pt2ph8

Ich mag Brian Chapados Antwort oben. Dies bedeutet jedoch, dass die Logik möglicherweise sowohl in cellForRowAtIndexPath als auch in willSelectRowAtIndexPath dupliziert wurde, wodurch die Synchronisation leicht verloren gehen kann. Anstatt die Logik zu duplizieren, überprüfen Sie einfach den selectionStyle:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.selectionStyle == UITableViewCellSelectionStyleNone)
        return nil;

    else
        return indexPath;
}
1
Eric D'Souza

auf Xcode 7 ohne Codierung können Sie einfach Folgendes tun:

Wählen Sie in der Gliederungsansicht Tabellensicht Zelle. (Die Zelle ist unter "Table View Controller Scene"> "Table View Controller"> "Table View" verschachtelt. Möglicherweise müssen Sie diese Objekte offenlegen, um die Zelle "Table View" anzuzeigen.)

Suchen Sie im Attribut-Inspektor das Feld Auswahl und wählen Sie Keine aus. atribute inspector Mit dieser Option erhält die Zelle keine visuelle Hervorhebung, wenn ein Benutzer darauf tippt.

1
Tung Fam

Implementiere nur die Methode tableView:willSelectRowAtIndexPath: in der Datenquelle für Ihre Tabelle. Wenn die Zeile am Pfad hervorgehoben werden soll, geben Sie den angegebenen Indexpfad zurück. Wenn Sie dies nicht tun, geben Sie nil zurück.

Beispiel aus meiner App:

- (NSIndexPath *)tableView:(UITableView *)tableView
    willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MySelectableObj* obj = [self objectAtPath:indexPath];
    if(obj==nil) return nil;
    return indexPath;
}

Das Schöne daran ist, dass shouldPerformSegueWithIdentifier:sender: wird nicht aufgerufen, wenn die obige Methode nil zurückgibt, obwohl ich den obigen Test der Vollständigkeit halber wiederhole.

0
user3821934

Für Xcode 6.3:

 cell.selectionStyle = UITableViewCellSelectionStyle.None;
0
uplearnedu.com

Ich stimme Bryans Antwort zu

wenn ich mache

cell.isUserInteractionEnabled = false 

dann werden die Unteransichten in der Zelle nicht vom Benutzer interagiert.

Auf der anderen Seite Einstellung

cell.selectionStyle = .none

löst die didSelect-Methode aus, obwohl die Auswahlfarbe nicht aktualisiert wurde.

Mit willSelectRowAt habe ich mein Problem gelöst. Beispiel:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {

    if indexPath.section == 0{

        if indexPath.row == 0{
            return nil
        }

    }
    else if indexPath.section == 1{

        if indexPath.row == 0{
            return nil
        }

    }

    return indexPath

}
0
Reimond Hill