Nessuna delle risposte precedenti risolve davvero correttamente il problema. Il motivo è che vogliamo disabilitare la selezione della cella ma non necessariamente delle visualizzazioni secondarie all'interno della cella.
Nel mio caso stavo presentando un UISwitch nel mezzo della riga e volevo disabilitare la selezione per il resto della riga (che è vuoto) ma non per l'interruttore! Il modo corretto di farlo è quindi nel metodo
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
dove una dichiarazione del modulo
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
disabilita la selezione per la cella specifica e allo stesso tempo consente all'utente di manipolare l'interruttore e quindi utilizzare il selettore appropriato. Questo non è vero se qualcuno disabilita l'interazione dell'utente attraverso il
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
metodo che semplicemente prepara la cellula e non consente l'interazione con l'UISwitch.
Inoltre, usando il metodo
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
per deselezionare la cella con una dichiarazione del modulo
[tableView deselectRowAtIndexPath:indexPath animated:NO];
mostra ancora la riga selezionata mentre l'utente preme sul contentView originale della cella.
Solo i miei due centesimi. Sono abbastanza sicuro che molti lo troveranno utile.