Respostas:
Defina a selectionStyle
propriedade da célula da tabela como UITableViewCellSelectionStyleNone
. Isso deve impedir que seja realçado e você também pode verificar essa propriedade no seu tableView:didSelectRowAtIndexPath:
.
Para evitar completamente a seleção do UITableViewCell
, tenha seu UITableViewDelegate
implemento tableView:willSelectRowAtIndexPath:
. A partir desse método, você pode retornar nil
se não quiser que a linha seja selecionada.
- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
// Determine if row is selectable based on the NSIndexPath.
if (rowIsSelectable) {
return path;
}
return nil;
}
Isso evita que a linha seja selecionada e tableView:didSelectRowAtIndexPath:
chamada. Observe, no entanto, que isso não impede que a linha seja destacada.
Se você quiser evitar que a linha seja visualmente destacada ao tocar, você pode garantir que a célula selectionStyle
está definida para UITableViewCellSelectionStyleNone
, ou de preferência você pode ter seu UITableViewDelegate
implemento da tableView:shouldHighlightRowAtIndexPath:
seguinte forma:
- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
// Determine if row is selectable based on the NSIndexPath.
return rowIsSelectable;
}
didSelectRowAtIndexPath
porque willSelectRowAtIndexPath
sempre será chamado de qualquer maneira.
usa isto:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
didSelectRowAtIndexPath
ainda é chamada.
Apenas para iOS 6+.
Você pode implementar o método
tableView:shouldHighlightRowAtIndexPath:
em seu delegado. Leia mais aqui: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html
Tive esse problema, também, tentei tudo já mencionado. O truque final, que eliminou o "flash azul" na seleção de uma célula da tabela, foi adicionar esta linha:
self.myTableView.allowsSelection = NO;
Não tenho certeza se foi essa linha ou tudo combinado, mas como resultado geral, não recebo mais seleção azul ou mesmo o flash azul. Feliz!
Conjunto cell.userInteractionEnabled = NO;
A Apple diz que a primeira coisa que você deve fazer em didSelectRowAtIndexPath é desmarcar a linha
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
Em seguida, você pode alterar o AccessoryType para ser uma marca de seleção, ou nenhum, etc. Portanto, ao inserir didSelectRowAtIndexPath, você pode desmarcar a linha e, se não for para ser selecionada, simplesmente não marque essa linha.
Outra maneira é adicionar alguns métodos de categoria a UITableViewCell
. Gosto mais dessa resposta do que de Sebastian (também bom), por causa da maneira como estou construindo minha mesa. Achei que poderia ser útil para outra pessoa.
- (void)setSelectable:(BOOL)enabled {
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
[self setUserInteractionEnabled:enabled];
}
- (BOOL)isSelectable {
BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
[self isUserInteractionEnabled];
return ! disabled;
}
Swift 4:
você pode evitar a seleção e o realce usando o UITableViewDelegate: shouldHighlightRowAt
Esta resposta pressupõe que você tenha uma célula personalizada criada chamada: CustomTableViewCell
E que você criou um booleano dentro dessa célula personalizada chamada: 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
}
}
Esta é a versão rápida da resposta objc de Sebastian Celis.
Existe outra maneira simples de evitar que a seleção apareça em azul.
Selecione uma célula que você não deseja que apareça em azul.
Em seguida, selecione o inspetor de atributos (o ícone de escudo próximo ao ícone da régua na visualização de propriedades na lateral).
Em seguida, altere o campo 'Seleção' de 'Azul' para 'Nenhum'.
Observe, presumivelmente, isso ainda está sendo selecionado, apenas não aparecerá como selecionado se tudo o que você quiser for evitar o efeito da interface do usuário.
Use tableView: willDisplayCell: forRowAtIndexPath: em vez de tableView: didSelectRowAtIndexPath: para se livrar do flash que aparece na primeira vez que você toca na célula.
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
Para tornar determinada linha desmarcada, você deve fazer algumas mudanças em dois métodos do delegado UITableView.
No método abaixo
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
após a alocação da célula, escreva o código abaixo
if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;
O código acima impedirá o destaque da célula, se de alguma forma o usuário tentar selecionar.
neste método delegado abaixo
- (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 você não escrever, a if(indexPath.row == someCellNumber) return;
linha ainda estará selecionada e há uma chance de travamento do aplicativo
tableView:shouldHighlightRowAtIndexPath:
conforme observado por Ayush abaixo