Risposte:
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:.
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.
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;
}
didSelectRowAtIndexPathperché willSelectRowAtIndexPathsarai sempre chiamato comunque.
Usa questo:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
didSelectRowAtIndexPathviene comunque chiamato.
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
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!
Impostato cell.userInteractionEnabled = NO;
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.
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;
}
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.
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.
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;
}
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
tableView:shouldHighlightRowAtIndexPath:come indicato di seguito da Ayush