UITableView Impostazione di alcune celle come "non selezionabili"


109

Come posso impostare la proprietà della cella di UITableView in modo che non sia selezionabile? Non voglio vedere la casella di selezione blu quando l'utente tocca la cella.


4
Nota i googler recenti: il modo per farlo a partire da iOS 6 e versioni successive è tableView:shouldHighlightRowAtIndexPath:come indicato di seguito da Ayush
jemmons

Risposte:


151

Imposta la selectionStyleproprietà della cella della tabella su UITableViewCellSelectionStyleNone. Ciò dovrebbe impedire che venga evidenziato e puoi anche controllare quella proprietà nel tuo file tableView:didSelectRowAtIndexPath:.


3
Kendall ha ragione. Segui la risposta di Sebastian Celis per impedire che didSelectRowAtIndexPath venga chiamato in primo luogo. Tuttavia, dovresti anche impostare selectionStyle per evitare l'evidenziazione.
Daniel Dickison

sì, suppongo che la risposta di Sebastian Celis sia la risposta corretta, grazie Daniel
LolaRun

1
I fan dello storyboard che utilizzano TableViews statici possono selezionare un UITableViewCell e in Attributes Inspector possono trovare il campo di selezione e impostarlo su Nessuno
Manuel BM,

197

Per impedire la selezione delle righe

Per impedire completamente la selezione di UITableViewCell, procurati l' UITableViewDelegateattrezzo tableView:willSelectRowAtIndexPath:. Da quel metodo puoi tornare nilse non vuoi che la riga venga selezionata.

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

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

Ciò impedisce che la riga venga selezionata e tableView:didSelectRowAtIndexPath:venga chiamata. Si noti, tuttavia, che ciò non impedisce di evidenziare la riga.

Per impedire l'evidenziazione delle righe

Se desideri impedire che la riga venga evidenziata visivamente al tocco, puoi assicurarti che la cella selectionStylesia impostata su UITableViewCellSelectionStyleNone, o preferibilmente puoi avere il tuo UITableViewDelegateattrezzo tableView:shouldHighlightRowAtIndexPath:come segue:

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

    return rowIsSelectable;
}

1
Grazie! Esattamente quello di cui avevo bisogno.
Buchannon

10
Questa dovrebbe essere la risposta accettata secondo me. In realtà risolve il problema invece di mascherarlo.
Tovi7

4
Si noti che tableView: willSelectRowAtIndexPath: viene chiamato dopo aver evidenziato la cella, che produrrà uno sfarfallio. Dalla descrizione di Apple: questo metodo non viene chiamato finché gli utenti non toccano una riga e quindi sollevano il dito; la riga non è selezionata fino a quel momento, anche se è evidenziata al touch-down.
Daniel

5
Sono d'accordo con @simpleBob. Per utilizzare questa soluzione, è necessario impostare anche cell.selectionStyle su UITableViewCellSelectionStyleNone sulle righe non selezionabili. Altrimenti sembra di cattivo gusto.
Kyle Clegg

Quindi la risposta migliore è ancora quella accettata. Puoi semplicemente scegliere di non fare nulla didSelectRowAtIndexPathperché willSelectRowAtIndexPathsarai sempre chiamato comunque.
Matthew Quiros

16

Usa questo:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5
Ciò interrompe solo la visualizzazione del colore di selezione, didSelectRowAtIndexPathviene comunque chiamato.
zekel

Anche questa è esattamente la stessa risposta di Daniel Dickison a questa domanda.

Aggiornamento Swift 2.2 - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com

11

Solo per iOS 6+.

Puoi implementare il metodo tableView:shouldHighlightRowAtIndexPath:nel tuo delegato. Maggiori informazioni qui: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html


3
Dovrebbe avere molti più voti positivi. Questa è la risposta corretta, cambiare lo stile di selezione in modo da non poter vedere una cella selezionata, disabilitare l'interazione dell'utente in modo da non poter toccare una cella o deselezionare le celle alla selezione sono hack.
Stuart Campbell

9

Aveva anche questo problema, provato tutto già menzionato. Il trucco finale, che ha eliminato il "lampo blu" nella selezione di una cella della tabella, è stato l'aggiunta di questa riga:

self.myTableView.allowsSelection = NO;

Non sono sicuro se fosse questa una linea o tutto combinato, ma come risultato generale totale non ottengo più la selezione blu o anche il flash blu. Contento!


1
Il problema con questo è che fa in modo che tutte le celle nella tableview non siano selezionabili. Se vuoi che alcune celle siano selezionabili e altre non selezionabili, questo non lo farà. L'approccio di Sebastian ha funzionato per me.
Terry

True, allowSelection = NO disabiliterà la selezione per tutte le celle.
JOM

1
Esiste una proprietà equivalente in Interface Builder per questa proprietà?
Chrish

8

Impostato cell.userInteractionEnabled = NO;


Aspetta, fallo così. Una specie di. fai "FALSE" minuscolo e perdi quel punto e virgola folle. Questo ti velocizzerà. "FALSO" era malvagio e sbagliato, ora "NO" è cattivo e sbagliato. Fino alla prossima settimana, quando "falso" è malvagio e sbagliato, fallo in questo modo.
HalR


3

Apple dice che la prima cosa che dovresti fare in didSelectRowAtIndexPath è deselezionare la riga

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

Quindi puoi cambiare AccessoryType in un segno di spunta, o nessuno, ecc. Quindi quando inserisci didSelectRowAtIndexPath puoi deselezionare la riga e, se non deve essere selezionata, semplicemente non selezionare quella riga.

Guida alla programmazione vista tabella


1
In tal caso, quando un utente tocca la cella, verrà evidenziata per un breve periodo e quindi non evidenziata, ma a quanto ho capito, il punto è impedirne completamente l'evidenziazione.
Kuba Suder

3

Un altro modo è aggiungere un paio di metodi di categoria a UITableViewCell. Mi piace di più rispetto a Sebastians (bravo anche lui) risposta perché il modo in cui sto costruendo la mia tavola. Ho pensato che potesse essere utile a qualcun altro.

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

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

3

Swift 4:
puoi impedire la selezione e l'evidenziazione utilizzando UITableViewDelegate: shouldHighlightRowAt

Questa risposta presuppone che tu abbia una cella personalizzata creata denominata: CustomTableViewCell
E che tu abbia creato un booleano all'interno di quella cella personalizzata denominata: 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
    }
}

Questa è la versione Swift della risposta objc di Sebastian Celis.


1

Se hai progettato la tua cella in Interface Builder, puoi farlo rimuovendo la casella di controllo da " Interazione utente abilitata " per il file tableViewCell.


0

C'è un altro modo semplice per evitare che la selezione appaia blu.

Seleziona una cella che non vuoi che appaia blu.

Quindi seleziona l'ispettore degli attributi (l'icona dello scudo accanto all'icona del righello nella vista delle proprietà a lato).

Quindi modifica il campo "Selezione" da "Blu" a "Nessuno".

Nota, presumibilmente questa è ancora la selezione, semplicemente non apparirà come selezionata se tutto ciò che vuoi è evitare l'effetto dell'interfaccia utente.


0

Usa tableView: willDisplayCell: forRowAtIndexPath: invece di tableView: didSelectRowAtIndexPath: per sbarazzarti del flash che appare la prima volta che tocchi la cella.

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

0

Per rendere alcune righe deselezionate è necessario apportare alcune modifiche a due metodi di delegato UITableView.

Nel metodo seguente

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

dopo l'assegnazione della cella, scrivi il codice qui sotto

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

Il codice sopra impedirà di evidenziare la cella, se in qualche modo l'utente tenta di selezionare.

in questo metodo delegato di seguito

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

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

se non scrivi la if(indexPath.row == someCellNumber) return;riga verrà comunque selezionata e c'è la possibilità che l'app si blocchi


0

Swift 4:

Nella classe della cella:

selectionStyle = .none

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.