Nenhuma das respostas acima realmente resolve o problema corretamente. O motivo é que queremos desativar a seleção da célula, mas não necessariamente de subvisões dentro da célula.
No meu caso, eu estava apresentando um UISwitch no meio da linha e queria desativar a seleção para o restante da linha (que está vazia), mas não para o comutador! A maneira correta de fazer isso está no método
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
onde uma declaração do formulário
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
desabilita a seleção para a célula específica e, ao mesmo tempo, permite ao usuário manipular a opção e, portanto, usar o seletor apropriado. Isso não é verdade se alguém desabilitar a interação do usuário através do
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
método que apenas prepara a célula e não permite a interação com o UISwitch.
Além disso, usando o método
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
para desmarcar a célula com uma declaração do formulário
[tableView deselectRowAtIndexPath:indexPath animated:NO];
ainda mostra a linha sendo selecionada enquanto o usuário pressiona o contentView original da célula.
Apenas meus dois centavos. Tenho certeza de que muitos acharão isso útil.