UITableView Configurando algumas células como “não selecionáveis”

109

Como posso definir a propriedade da célula do UITableView como não selecionável? Não quero ver aquela caixa de seleção azul quando o usuário toca na célula.

Mugunth
fonte
4
Observe os googlers recentes: a maneira de fazer isso a partir do iOS 6 e superior é tableView:shouldHighlightRowAtIndexPath:conforme observado por Ayush abaixo
jemmons

Respostas:

151

Defina a selectionStylepropriedade 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:.

Daniel Dickison
fonte
3
Kendall está certo. Siga a resposta de Sebastian Celis para evitar que didSelectRowAtIndexPath seja chamado em primeiro lugar. Você também deve definir selectionStyle, entretanto, para evitar o realce.
Daniel Dickison
sim, suponho que a resposta de Sebastian Celis seja a resposta correta, obrigado Daniel
LolaRun
1
Os fãs de storyboard usando TableViews estáticas podem selecionar um UITableViewCell e, em Attributes Inspector, pode encontrar o campo de seleção e defini-lo como Nenhum
Manuel BM
197

Para evitar a seleção de linha

Para evitar completamente a seleção do UITableViewCell, tenha seu UITableViewDelegateimplemento tableView:willSelectRowAtIndexPath:. A partir desse método, você pode retornar nilse 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.

Para evitar o realce de linha

Se você quiser evitar que a linha seja visualmente destacada ao tocar, você pode garantir que a célula selectionStyleestá definida para UITableViewCellSelectionStyleNone, ou de preferência você pode ter seu UITableViewDelegateimplemento da tableView:shouldHighlightRowAtIndexPath:seguinte forma:

- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Determine if row is selectable based on the NSIndexPath.

    return rowIsSelectable;
}
Sebastian celis
fonte
1
Obrigado! Exatamente o que eu precisava.
Buchannon
10
Esta deve ser a resposta aceita em minha opinião. Na verdade, ele corrige o problema em vez de mascará-lo.
Tovi7
4
Observe que tableView: willSelectRowAtIndexPath: é chamado após destacar a célula, o que produzirá uma cintilação. Da descrição da Apple: Este método não é chamado até que os usuários toquem em uma linha e levantem o dedo; a linha não é selecionada até então, embora seja destacada no toque.
Daniel
5
Eu concordo com @simpleBob. Para usar essa solução, você também precisa definir cell.selectionStyle como UITableViewCellSelectionStyleNone nas linhas não selecionáveis. Caso contrário, parece cafona.
Kyle Clegg
Então, a melhor resposta ainda é a resposta aceita. Você pode simplesmente optar por não fazer nada didSelectRowAtIndexPathporque willSelectRowAtIndexPathsempre será chamado de qualquer maneira.
Matthew Quiros
16

usa isto:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
HanumanDev
fonte
5
Isso só impede que a cor da seleção seja exibida, didSelectRowAtIndexPathainda é chamada.
zekel
Esta também é exatamente a mesma resposta de Daniel Dickison a essa pergunta.
Swift 2.2 UPDATE - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com
11

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

Ayush Goel
fonte
3
Deveria ter muito mais votos positivos. Esta é a resposta correta, mudar o estilo de seleção para que você não possa ver uma célula selecionada, desabilitar a interação do usuário para que você não possa tocar em uma célula ou desmarcar as células na seleção são truques.
Stuart Campbell
9

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!

JOM
fonte
1
O problema com isso é que isso faz com que todas as células na visualização da tabela não sejam selecionáveis. Se você quiser que alguma célula seja selecionável e outras não, isso não será suficiente. A abordagem de Sebastian funcionou para mim.
Terry
True, allowSelection = NO desabilitará a seleção de todas as células.
JOM
1
Existe uma propriedade equivalente no Interface Builder para esta propriedade?
chrish de
8

Conjunto cell.userInteractionEnabled = NO;

Rob Bonner
fonte
Espere, faça assim. Tipo de. torne 'FALSE' minúsculo e perca aquele ponto-e-vírgula maluco. Isso será rápido para você. 'FALSE' era mau e errado, agora 'NÃO' é mau e errado. Até a próxima semana, quando 'falso' é mau e errado, faça assim.
HalR de
5

usar IB também é uma maneira elegante:

insira a descrição da imagem aqui

Brian
fonte
3

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.

Guia de programação de visualização de tabela

Ryanday
fonte
1
Nesse caso, quando um usuário toca a célula, ela fica destacada por um curto período de tempo e, em seguida, deixa de ser destacada - mas, pelo que entendi, o objetivo é interromper completamente o destaque.
Kuba Suder
3

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;
}
zekel
fonte
3

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.

Chase McElroy
fonte
1

Se você projetou sua célula no Interface Builder, pode fazer isso removendo a caixa de seleção de ' Interação do usuário habilitada ' para o tableViewCell.

Jay
fonte
0

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.

sien
fonte
0

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;
}
user3164248
fonte
0

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

Dipu Rajak
fonte
0

Swift 4:

Na classe de células:

selectionStyle = .none
Éden
fonte
0

Swift 5

cell.isUserInteractionEnabled = false
S. Mert
fonte