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:

  1. Abaixo, desabilitar o destaque, mas também desativa a chamada para didSelectRowAtIndexPath . Portanto, se você não estiver implementando didSelectRowAtIndexPath , use o método abaixo. Isso deve ser adicionado quando você está criando a tabela. Isso funcionará nos botões e no UITextField dentro da célula.

    self.tableView.allowsSelection = NO;
  2. Abaixo do destaque do desabilitamento de didSelectRowAtIndexPath e não desativa a chamada para didSelectRowAtIndexPath . Defina o estilo de seleção de célula como None em cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
  3. 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 :

  1. Substituição da primeira solução

    self.tableView.allowsSelection = false
  2. Substituição da segunda solução

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
  3. 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 XIB do seu UITableViewCell no Inspetor de Atributos, defina o valor de Selection como None .


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;




cocoa-touch