ios - uitableviewdelegate - Come posso disattivare la selezione di UITableView?




uitableviewdelegate ios (20)

Quando tocchi una riga in un UITableView , la riga viene evidenziata e selezionata. È possibile disabilitare questo, quindi toccare una riga non fa nulla?


Objective-C:

  1. Sotto snippet disabilita l'evidenziazione ma disabilita anche la chiamata a didSelectRowAtIndexPath . Quindi se non stai implementando didSelectRowAtIndexPath allora usa il metodo seguente. Questo dovrebbe essere aggiunto durante la creazione della tabella. Questo funzionerà su pulsanti e UITextField all'interno della cella però.

    self.tableView.allowsSelection = NO;
    
  2. Sotto snippet disabilita l'evidenziazione e non disattiva la chiamata a didSelectRowAtIndexPath . Impostare lo stile di selezione della cella su Nessuno in cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. Sotto snippet disabilitare tutto sulla cella. Questo disabiliterà l'interazione con i buttons , textfields :

    self.tableView.userInteractionEnabled = false;
    

Swift:

Di seguito sono riportati gli equivalenti Swift delle soluzioni Objective-C di cui sopra:

  1. Sostituzione della prima soluzione

    self.tableView.allowsSelection = false
    
  2. Sostituzione della seconda soluzione

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
    
  3. Sostituzione della terza soluzione

    self.tableView.userInteractionEnabled = false
    

È anche possibile impostare il colore di sfondo su Cancella per ottenere lo stesso effetto di UITableViewCellSelectionStyleNone , nel caso in cui non si desideri / non sia possibile utilizzare UITableViewCellSelectionStyleNone .

Dovresti usare il codice come il seguente:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

Ciò potrebbe peggiorare le tue prestazioni aggiungendo una vista colorata aggiuntiva a ogni cella.


È possibile utilizzare la proprietà selectionStyle di UITableViewCell

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

O

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Inoltre, non implementare sotto delegato

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }

Se hai creato il file Xib / Storyboard, puoi modificare la proprietà setUserInteractionEnabled di tableview su No deselezionandola. Questo renderà la tua vista del tavolo in sola lettura.


A partire da iOS 6.0, UITableViewDelegate ha tableView:shouldHighlightRowAtIndexPath: (Leggi informazioni sulla Documentation iOS.)

Questo metodo consente di contrassegnare le righe specifiche come non leggibili (e implicitamente, non selezionabili) senza dover modificare lo stile di selezione di una cella, facendo confusione con la gestione degli eventi della cella con userInteractionEnabled = NO o con qualsiasi altra tecnica documentata qui.


Devi solo inserire questo codice in cellForRowAtIndexPath

Per disabilitare la proprietà di selezione della cella: (Mentre si tocca la cella).

cell.selectionStyle = UITableViewCellSelectionStyle.None

Ho combattuto con questo abbastanza profusamente, avendo un controllo nel mio UITableViewCell proibito l'uso della proprietà userInteractionEnabled . Ho una tabella statica a 3 celle per le impostazioni, 2 con le date, 1 con un interruttore on / off. Dopo aver giocato in Storyboard / IB sono riuscito a rendere non selezionabile quello in basso, ma quando lo tocchi la selezione da una delle righe in alto scompare. Ecco un'immagine WIP delle mie impostazioni UITableView:

Se si tocca la terza riga, non accade nulla, la selezione rimane sulla seconda riga. La funzionalità è praticamente una copia della schermata di selezione dell'ora dell'evento Aggiungi app di Apple Calendar.

Il codice è sorprendentemente compatibile, fino a IOS2 = /:

- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 2) {
        return nil;
    }
    return indexPath;
}

Questo funziona in congiunzione con l'impostazione dello stile di selezione su none, quindi la cella non sfarfalla sugli eventi di tocco


Nel tuo UITableViewCell , XIB in Attribute Inspector imposta il valore di Selection su None .


Per disabilitare l'evidenziazione di UItableviewcell

cell.selectionStyle = UITableViewCellSelectionStyleNone;

E non dovrebbe consentire all'utente di interagire con la cella.

cell.userInteractionEnabled = NO;

Per riassumere ciò che ritengo siano le risposte corrette in base alla mia esperienza personale nell'implementazione di questo:

Se si desidera disabilitare la selezione solo per alcune celle, utilizzare:

cell.userInteractionEnabled = NO;

Oltre a impedire la selezione, questo arresta anche tableView: didSelectRowAtIndexPath: viene chiamato per le celle che lo hanno impostato. (Il merito va a Tony Million per questa risposta, grazie!)

Se hai bisogno di fare clic sui pulsanti delle celle, devi invece:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

e devi anche ignorare qualsiasi clic sulla cella in - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath .

Se si desidera disabilitare la selezione per l'intera tabella, utilizzare:

tableView.allowsSelection = NO;

(Credito a Paulo De Barros, grazie!)


Perché ho letto questo post di recente e mi ha aiutato, ho voluto postare un'altra risposta per consolidare tutte le risposte (per i posteri).


Quindi, ci sono in realtà 5 risposte diverse a seconda della logica e / o risultato desiderati:

1.Per disabilitare l'evidenziazione blu senza modificare alcuna altra interazione della cella:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Lo uso quando ho un UIButton - o qualche altro controllo - ospitato in un UITableViewCell e voglio che l'utente sia in grado di interagire con i controlli ma non con la cella stessa.

NOTA : come notato da Tony Million, questo NON impedisce tableView:didSelectRowAtIndexPath: Mi aggiro di questo con semplici istruzioni "if", il più delle volte testando la sezione ed evitando l'azione per una particolare sezione.

Un altro modo in cui ho pensato di testare il tocco di una cella come questa è:

- (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.Per fare questo per un'intera tabella, è possibile applicare la soluzione di cui sopra a ciascuna cella nella tabella, ma è anche possibile farlo:

[tableView setAllowsSelection:NO];

Nei miei test, questo consente comunque ai controlli all'interno di UITableViewCell di essere interattivi.


3. Per rendere una cella "di sola lettura", puoi semplicemente farlo:

[cell setUserInteractionEnabled:NO];



4.Per rendere un intero tavolo "di sola lettura"

[tableView setUserInteractionEnabled:NO];



5.Per determinare al volo se evidenziare una cella (che in base a questa risposta include implicitamente la selezione), è possibile implementare il seguente metodo di protocollo UITableViewDelegate :

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath

Prova a digitare:

cell.selected = NO;

Deselezionerà la tua riga quando necessario.

In Swift3 ...

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let r = indexPath.row
    print("clicked .. \(r)")
    tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}

Puoi anche farlo dallo storyboard. Fare clic sulla cella della vista tabella e nella finestra di ispezione Attributi in Cella visualizzazione tabella, modificare il menu a discesa accanto a Selezione su Nessuno.


Puoi usare questo

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Questa è la soluzione migliore e più semplice per evitare che una riga mostri l'evidenziazione durante la selezione

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Vorrei anche suggerire che è talvolta utile mostrare brevemente che la riga è stata selezionata e quindi disattivarla. Questo avverte gli utenti con una conferma di ciò che intendevano selezionare:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}

Se vuoi che la selezione lampeggi solo, non rimanere nello stato selezionato, puoi chiamare, in

didSelectRowAtIndexPath

il seguente

[tableView deselectRowAtIndexPath:indexPath animated:YES];

quindi lampeggerà lo stato selezionato e si ripristinerà.


Sto usando questo, che funziona per me.

cell?.selectionStyle = UITableViewCellSelectionStyle.None

per una rapida deselezione

cell.selectionStyle = .None

prova questo

cell.selectionStyle = UITableViewCellSelectionStyleNone;

e

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

e puoi anche impostare lo stile di selezione usando interfacebuilder.


Soluzione rapida con cella personalizzata:

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

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Buona programmazione !!!







cocoa-touch