ios - uitableviewcell - Como posso desativar a seleção UITableView?
xcode uitableview custom cell (20)
Quando você toca em uma linha em um UITableView
, a linha é destacada e selecionada. É possível desabilitar isso, então tocar em uma linha não faz nada?
Objetivo-C:
Abaixo, desabilitar o destaque, mas também desativa a chamada para
didSelectRowAtIndexPath
. Portanto, se você não estiver implementandodidSelectRowAtIndexPath
, use o método abaixo. Isso deve ser adicionado quando você está criando a tabela. Isso funcionará nos botões e noUITextField
dentro da célula.self.tableView.allowsSelection = NO;
Abaixo do destaque do desabilitamento de
didSelectRowAtIndexPath
e não desativa a chamada paradidSelectRowAtIndexPath
. Defina o estilo de seleção de célula como None emcellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Abaixo do snippet, desative tudo na célula. Isso desativará a interação para
buttons
,textfields
:self.tableView.userInteractionEnabled = false;
Rápido:
Abaixo está o equivalente Swift
acima das soluções Objective-C
:
Substituição da primeira solução
self.tableView.allowsSelection = false
Substituição da segunda solução
cell?.selectionStyle = UITableViewCellSelectionStyle.None
Substituição da Terceira Solução
self.tableView.userInteractionEnabled = false
A partir do iOS 6.0, o UITableViewDelegate
possui tableView:shouldHighlightRowAtIndexPath:
(Leia sobre isso na Documentation do iOS.)
Esse método permite marcar linhas específicas como não destacáveis (e implicitamente, não selecionáveis) sem ter que alterar o estilo de seleção de uma célula, mexendo com o tratamento de eventos da célula com userInteractionEnabled = NO
ou qualquer outra técnica documentada aqui.
Do UITableViewDelegate
Protocol, você pode usar o método willSelectRowAtIndexPath
e return nil
se não quiser a linha selecionada.
Da mesma forma, você pode usar o método willDeselectRowAtIndexPath
e return nil
se não quiser que a linha seja desmarcada.
Embora essa seja a melhor e mais fácil solução para evitar que uma linha mostre o destaque durante a seleção
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Também gostaria de sugerir que ocasionalmente seja útil mostrar brevemente que a linha foi selecionada e desativá-la. Isso alerta os usuários com uma confirmação do que eles pretendiam selecionar:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
Eu tenho lutado com isso bastante profusamente também, tendo um controle no meu UITableViewCell
proibiu o uso da propriedade userInteractionEnabled
. Eu tenho uma tabela estática de 3 células para configurações, 2 com datas, 1 com um botão liga / desliga. Depois de jogar no Storyboard / IB eu consegui fazer o bottom um não selecionável, mas quando você toca nele a seleção de uma das linhas superiores desaparece. Aqui está uma imagem WIP das minhas configurações UITableView:
Se você tocar na terceira linha nada acontece, a seleção vai ficar na segunda linha. A funcionalidade é praticamente uma cópia da tela de seleção de tempo de adição de eventos do Calendário da Apple.
O código é surpreendentemente compatível, até o IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
Isso funciona em conjunto com a configuração do estilo de seleção para nenhum, portanto, a célula não pisca em eventos de toque.
Isto é o que eu uso, em cellForRowAtIndexPath
escrever este código .:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
No caso de alguém precisar de resposta para o Swift :
cell.selectionStyle = .None
Para mim, o seguinte funcionou bem:
tableView.allowsSelection = NO;
Isso significa que didSelectRowAt#
simplesmente não funcionará. Isto é, tocar uma linha da mesa, como tal, não fará absolutamente nada. (E, portanto, obviamente, nunca haverá uma animação selecionada.)
(Note que se, nas células, você tiver UIButton
ou qualquer outro controle, é claro que esses controles ainda funcionarão. Quaisquer controles que você tenha na célula da tabela, não são relacionados à capacidade do UITableView de permitir que você selecione uma linha. "usando didSelectRowAt#
.)
Para resumir o que acredito são as respostas corretas com base na minha própria experiência na implementação deste:
Se você quiser desabilitar a seleção para apenas algumas das células, use:
cell.userInteractionEnabled = NO;
Além de impedir a seleção, isso também impede que tableView: didSelectRowAtIndexPath: seja chamado para as células que o definiram. (O crédito vai para o Tony Million por esta resposta, obrigado!)
Se você tem botões em suas células que precisam ser clicados, você precisa:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
e você também precisa ignorar qualquer clique na célula em - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
.
Se você quiser desabilitar a seleção para toda a tabela, use:
tableView.allowsSelection = NO;
(Crédito ao Paulo De Barros, obrigado!)
Se você quiser que a seleção apenas pisque, não permaneça no estado selecionado, você pode ligar, em
didSelectRowAtIndexPath
Os seguintes
[tableView deselectRowAtIndexPath:indexPath animated:YES];
então ele irá piscar o estado selecionado e reverter.
Tente digitar:
cell.selected = NO;
Ele irá desmarcar sua linha quando necessário.
No Swift3 ...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let r = indexPath.row
print("clicked .. \(r)")
tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}
Você pode usar ....
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Você pode usar isso
cell.selectionStyle = UITableViewCellSelectionStyleNone;
Você também pode definir a cor de segundo plano como Clear para obter o mesmo efeito de UITableViewCellSelectionStyleNone
, caso não queira / não possa usar UITableViewCellSelectionStyleNone
.
Você usaria um código como o seguinte:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
Isso pode degradar seu desempenho ao adicionar uma visualização colorida extra a cada célula.
Você também pode desabilitar a seleção de linha do próprio criador de interface, escolhendo NoSelection
na opção de selection
(de UITableView Properties) no painel de NoSelection
conforme mostrado na imagem abaixo.
para desmarcação rápida
cell.selectionStyle = .None
tente isso
cell.selectionStyle = UITableViewCellSelectionStyleNone;
e
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
e você também pode definir o estilo de seleção usando o interfacebuilder.
Solução Swift com Célula Personalizada:
import Foundation
class CustomTableViewCell: UITableViewCell
{
required init(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
{
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.selectionStyle = UITableViewCellSelectionStyle.None
}
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;