Quando si tocca una riga in a UITableView
, la riga viene evidenziata e selezionata. È possibile disabilitarlo, quindi toccare una riga non fa nulla?
Quando si tocca una riga in a UITableView
, la riga viene evidenziata e selezionata. È possibile disabilitarlo, quindi toccare una riga non fa nulla?
Risposte:
Per me, il seguente ha funzionato bene:
tableView.allowsSelection = false
Questo significa che didSelectRowAt#
semplicemente non funzionerà. Vale a dire, toccare una fila del tavolo, come tale, non farà assolutamente nulla. (E quindi, ovviamente, non ci sarà mai un'animazione selezionata.)
(Nota che se, sulle celle, hai UIButton
o qualsiasi altro controllo, ovviamente quei controlli funzioneranno comunque. Tutti i controlli che hai sulla cella della tabella, sono totalmente estranei alla capacità di UITableView di permetterti di "selezionare una riga" utilizzando didSelectRowAt#
.)
Un altro punto da notare è che: questo non funziona quando UITableView
è in modalità di modifica. Per limitare la selezione di celle in modalità di modifica, utilizzare il codice come indicato di seguito:
tableView.allowsSelectionDuringEditing = false
selectionStyle
proprietà sulla cella: cell.selectionStyle = UITableViewCellSelectionStyle.None
in Swift o cell.selectionStyle = UITableViewCellSelectionStyleNone
in Objective-C.
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
chiamare, cell.selectionStyle = .None
si desidera. Se non si desidera o non si desidera che venga chiamata quella funzione delegata (ovvero con un campo di testo in un tableViewCell) tableView.allowsSelection = false
va bene.
Tutto quello che devi fare è impostare lo stile di selezione UITableViewCell
sull'istanza usando:
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
o
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 e 4.x:
cell.selectionStyle = .none
Inoltre, assicurarsi di non implementare -tableView:didSelectRowAtIndexPath:
nella vista tabella delegato o di escludere esplicitamente le celle che non si desidera avere alcuna azione se lo si implementa.
Poiché ho letto questo post di recente e mi ha aiutato, volevo pubblicare un'altra risposta per consolidare tutte le risposte (per i posteri).
Quindi, in realtà ci sono 5 risposte diverse a seconda della logica e / o del risultato desiderati:
1.Per disabilitare l'evidenziazione blu senza modificare altre interazioni della cella:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Lo uso quando ho un UIButton - o qualche altro controllo (i) - 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 ha osservato Tony Million sopra, questo NON impediscetableView:didSelectRowAtIndexPath:
. Lo aggiro con semplici istruzioni "if", il più delle volte test per la sezione ed evitando azioni 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 eseguire questa operazione per un'intera tabella, è possibile applicare la soluzione di cui sopra a ciascuna cella della tabella, ma è anche possibile:
[tableView setAllowsSelection:NO];
Nei miei test, questo consente comunque ai controlli all'interno UITableViewCell
di essere interattivi.
3.Per rendere una cella "sola lettura", puoi semplicemente fare questo:
[cell setUserInteractionEnabled:NO];
4.Per rendere l'intera tabella "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 UITableViewDelegate
metodo di protocollo:
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
tableView:shouldHighlightRowAtIndexPath:
, che è generalmente (non sempre) il mio approccio preferito.
Riassumendo ciò che credo siano le risposte corrette basate sulla mia esperienza nell'implementazione di questo:
Se vuoi disabilitare la selezione solo per alcune celle, usa:
cell.userInteractionEnabled = NO;
Oltre a impedire la selezione, questo arresta anche tableView: didSelectRowAtIndexPath: chiamato per le celle che lo hanno impostato. (Il merito va a Tony Million per questa risposta, grazie!)
Se hai dei pulsanti nelle celle che devono essere cliccati, 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;
(Ringraziamo Paulo De Barros, grazie!)
A partire da iOS 6.0, UITableViewDelegate
ha tableView:shouldHighlightRowAtIndexPath:
. (Leggi a riguardo nella documentazione di iOS .)
Questo metodo consente di contrassegnare righe specifiche come non illuminabili (e implicitamente, non selezionabili) senza dover cambiare lo stile di selezione di una cella, fare confusione con la gestione degli eventi della cella con userInteractionEnabled = NO
o altre tecniche documentate qui.
È inoltre possibile disabilitare la selezione di fila da Interface Builder per sé, scegliendo NoSelection
dalla selection
possibilità (di proprietà UITableView) nel pannello impostazioni, come mostrato nell'immagine qui sotto
SOLUZIONE FISSA PER SWIFT 3
cell.selectionStyle = .none
Se si desidera che la selezione lampeggi solo, non rimanga nello stato selezionato, è possibile chiamare, in
didSelectRowAtIndexPath
il seguente
[tableView deselectRowAtIndexPath:indexPath animated:YES];
quindi lampeggerà lo stato selezionato e ripristinerà.
Nel caso in cui qualcuno abbia bisogno di una risposta per Swift :
cell.selectionStyle = .None
Questo è quello che uso, per cellForRowAtIndexPath
scrivere questo codice .:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Dal UITableViewDelegate
protocollo è possibile utilizzare il metodo willSelectRowAtIndexPath
e return nil
se non si desidera selezionare la riga.
Allo stesso modo è possibile utilizzare il willDeselectRowAtIndexPath
metodo e return nil
se non si desidera deselezionare la riga.
1- Tutto quello che devi fare è impostare lo stile di selezioneUITableViewCell
sull'istanza usando:
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
o
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Swift 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3:
cell.selectionStyle = .none
2 - Non implementare - tableView:didSelectRowAtIndexPath:
nella vista tabella delegate
o escludere esplicitamente le celle che non si desidera avere alcuna azione se lo si implementa.
3 - Inoltre, puoi anche farlo dallo storyboard. Fai clic sulla cella della vista tabella e nella finestra di ispezione degli attributi in Cella della vista tabella, modifica il menu a discesa accanto a Selezione su Nessuno.
4 - È possibile disabilitare l'evidenziazione della cella della tabella utilizzando il codice seguente in (iOS) Xcode 9, Swift 4.0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
Sotto lo snippet disabilita l'evidenziazione ma disabilita anche la chiamata a didSelectRowAtIndexPath
. Quindi, se non stai implementando, didSelectRowAtIndexPath
usa il metodo seguente. Questo dovrebbe essere aggiunto quando si crea la tabella. Questo funzionerà su pulsanti e UITextField
all'interno della cella però.
self.tableView.allowsSelection = NO;
Sotto lo snippet disabilita l'evidenziazione e non disabilita la chiamata a didSelectRowAtIndexPath
. Impostare lo stile di selezione della cella su Nessuno incellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Lo snippet di seguito disabilita tutto sulla cella. Questo disabiliterà l'interazione a buttons
, textfields
:
self.tableView.userInteractionEnabled = false;
Di seguito sono riportati gli Swift
equivalenti delle Objective-C
soluzioni precedenti :
Sostituzione della prima soluzione
self.tableView.allowsSelection = false
Sostituzione della seconda soluzione
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Sostituzione della terza soluzione
self.tableView.userInteractionEnabled = false
Prova a digitare:
cell.selected = NO;
Deselezionerà la 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)
}
Ho lottato con questo abbastanza abbondantemente, avendo un controllo nel mio UITableViewCell
proibito l'uso della userInteractionEnabled
proprietà. Ho una tabella statica a 3 celle per le impostazioni, 2 con le date, 1 con un interruttore on / off. Dopo aver giocato su Storyboard / IB sono riuscito a rendere non selezionabile quello in basso, ma quando lo tocchi la selezione da una delle prime righe scompare. Ecco un'immagine WIP delle mie impostazioni UITableView:
Se tocchi la terza riga non succede nulla, la selezione rimarrà sulla seconda riga. La funzionalità è praticamente una copia della schermata di selezione dell'ora di aggiunta dell'app Calendario di Apple.
Il codice è sorprendentemente compatibile, fino a IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
Funziona insieme all'impostazione dello stile di selezione su nessuno, quindi la cella non sfarfalla su eventi di touchdown
Possiamo scrivere codice come
cell.selectionStyle = UITableViewCellSelectionStyleNone;
ma quando abbiamo una cella personalizzata xib sopra la linea dare avvertimento in quel momento per
cella personalizzata xib
dobbiamo impostare lo stile di selezione Nessuno dal builder dell'interfaccia
Devi solo inserire questo codice in cellForRowAtIndexPath
Per disabilitare la proprietà di selezione della cella: (Mentre si tocca la cella).
cell.selectionStyle = UITableViewCellSelectionStyle.None
Sto usando questo, che funziona per me.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Mentre 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 a volte è utile mostrare brevemente che la riga è stata selezionata e quindi disattivarla. Questo avvisa gli utenti con una conferma di ciò che intendevano selezionare:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
È inoltre possibile impostare il colore di sfondo su Cancella per ottenere lo stesso effetto UITableViewCellSelectionStyleNone
, nel caso in cui non si desideri / non si possa usare UITableViewCellSelectionStyleNone
.
Utilizzeresti un 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 quando aggiungi una vista colorata in più a ogni cella.
Puoi usare :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
nella cella per la riga nel metodo del percorso dell'indice di UITableView.
Inoltre puoi usare:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
nel tableview didselectrowatindexpath method.
cell.selectionStyle = UITableViewCellSelectionStyle.none
in Swift 3.
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
Buona codifica !!!
selection
, e ovviamentehighlighting
viene disabilitato con quello. Molte risposte molto votate spiegano comedisable selection
e non affrontano la disabilitazionehighlighting
. Per disabilitare solo l'evidenziazione usacell.selectionStyle = .None
o vai astoryboard / cell / Selection = None