Estou exibindo em um tableview
conteúdo de grupo analisado de XML. Desejo desativar o evento click nele (não devo clicar nele). A tabela contém dois grupos. Desejo desativar a seleção apenas para o primeiro grupo, mas não para o segundo. Clicando na primeira linha do segundo grupo navigates
no meu tube player view
.
Como posso selecionar apenas grupos ou linhas específicos?
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section!=0)
if(indexPath.row==0)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]];
}
Obrigado.
fonte
tableView:shouldHighlightRowAtIndexPath:
é um novoUITableViewDelegate
método que retorna um comBOOL
base em se o passadoindexPath
deve ou não ser destacado. Se você está construindo para a versão 6.0 e posterior, recomendo fortemente esta nova API.cell!.selectionStyle = .None
qual força desembrulha a célula, permitindo acessar suas propriedades.Se você deseja tornar uma linha (ou subconjunto de linhas) não selecionável , implemente o
UITableViewDelegate
método-tableView:willSelectRowAtIndexPath:
(também mencionado pelo TechZen). SeindexPath
não puder ser selecionado , retornenil
, caso contrário, retorneindexPath
. Para obter o comportamento de seleção padrão, basta retornar oindexPath
passado ao seudelegate
método, mas você também pode alterar a seleção de linha retornando um diferenteindexPath
.exemplo:
fonte
A partir do iOS 6, você pode usar
Se você retornar
NO
, desabilitará o destaque da seleção e os seguimentos acionados pelo storyboard conectados a essa célula.O método é chamado quando um toque é pressionado em uma linha. Retornar
NO
a essa mensagem interrompe o processo de seleção e não faz com que a linha atualmente selecionada perca a aparência selecionada enquanto o toque é pressionado.Referência do protocolo UITableViewDelegate
fonte
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
onde uma declaração do formulário
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
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
para desmarcar a célula com uma declaração do formulário
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.
fonte
willSelectRowAtIndexPath
tem o mesmo problema, as subvisões não são selecionáveis.Você intercepta seleções com esses métodos de fonte de dados.
Nesses métodos, você verifica se a linha selecionada é aquela que deseja ser selecionável. Se for, execute uma ação, se não, não faça nada.
Infelizmente, você não pode desativar a seleção em apenas uma seção. É a mesa inteira ou nada.
No entanto, você pode definir a
selectionStyle
propriedade de células da tabela comoUITableViewCellSelectionStyleNone
. Acredito que tornará a seleção invisível. Combinado com os métodos acima, que devem fazer com que as células pareçam completamente inertes da perspectiva do usuário.Edit01:
Se você possui uma tabela na qual apenas algumas das linhas são selecionáveis, é importante que as células das linhas selecionáveis sejam visualmente distintas das linhas não selecionáveis. O botão de acessórios da chevron é a maneira padrão de fazer isso.
Seja como for, você não quer que seus usuários tentem selecionar linhas e pensem que o aplicativo falhou porque a linha não faz nada.
fonte
Help -> Developer documentation
e copie esses nomes de métodos no campo de pesquisa para ver como ele funciona. A documentação do desenvolvedor também contém código de exemplo.Para o Swift 4.0, por exemplo:
fonte
Você precisa fazer algo como o seguinte para desativar a seleção de células dentro do
cellForRowAtIndexPath
método:Para mostrar a célula acinzentada, coloque o seguinte no
tableView:WillDisplayCell:forRowAtIndexPath
método:Um método permite controlar a interatividade, o outro permite controlar a aparência da interface do usuário.
fonte
Para interromper a seleção de algumas células, use:
Além de impedir a seleção, isso também impede que tableView: didSelectRowAtIndexPath: seja chamado pelas células que o definiram.
fonte
userInteractionEnabled
como NO em uma célula (mais claramente, um indexPath), a interação do usuário com algumas OUTRAS células é desativada. Não faço idéia por que isso acontece toda vez que usouserInteractionEnabled
em células de exibição de tabela. É um bug conhecido ou eu fiz algo errado?if [indexPath row] == 0
) paraNO
emtableView:cellForRowAtIndexPath:
após dequeueing da célula. Geralmente funciona bem no início. Depois de várias chamadasreloadData
, de repente a quinta linha não permite a interação e a quarta linha. Não consigo descobrir quando isso acontecerá. A coisa toda parece aleatória.if [indexPath row] == 0) { set to NO } else { set to YES }
Você pode usar o
tableView:willDisplayCell
método para fazer todos os tipos de personalização em um tableViewCell.Nesse código acima, o usuário pode selecionar apenas a primeira linha na segunda seção do tableView. O restante de todas as linhas não pode ser selecionado. Obrigado!
fonte
Para rápida:
fonte
Minha solução baseada no modelo de dados:
fonte
Para o Swift 4.0, isso fará o truque. Ele desativará a célula no método didSelectRowAtIndexPath, mas manterá as subvisões clicáveis.
fonte
return indexPath.row == clickableIndex ? indexPath : nil
:, mantém seu código um pouco mais limpo ;-)Use isso para fazer com que a célula pareça desabilitada e não selecionável:
Importante: observe que essa é apenas uma propriedade de estilo e, na verdade, não desativa a célula. Para fazer isso, você deve verificar
selectionStyle
adidSelectRowAtIndexPath:
implementação do seu delegado:fonte
Eu gosto da resposta de Brian Chapados acima. No entanto, isso significa que você pode ter a lógica duplicada no cellForRowAtIndexPath e depois no willSelectRowAtIndexPath, que pode facilmente ficar fora de sincronia. Em vez de duplicar a lógica, basta verificar o selectionStyle:
fonte
Achei isso útil, pois trabalha com tabelas estáticas e dinâmicas. Defino apenas o indicador de divulgação nas células que desejo permitir a seleção.
fonte
no Xcode 7 sem codificação, você pode simplesmente fazer o seguinte:
Na exibição de estrutura de tópicos, selecione Célula de exibição de tabela. (A célula está aninhada em Cena do controlador de exibição de tabela> Controlador de exibição de tabela> Exibição de tabela. Talvez seja necessário divulgar esses objetos para ver a célula de exibição de tabela)
No inspetor Atributos, localize o campo Seleção e selecione Nenhum. Atribuir inspetor Com esta opção, a célula não receberá um destaque visual quando um usuário toca nela.
fonte
SIMPLES
Basta usar
cell.userInteractionEnabled = YES;
a célula se ela puder navegar e decell.userInteractionEnabled = NO;
outra formafonte
Implemente apenas o método
tableView:willSelectRowAtIndexPath:
na fonte de dados para sua tabela. Se você deseja destacar a linha no caminho, retorne o indexPath fornecido. Caso contrário, retorne zero.Exemplo do meu aplicativo:
O bom disso é que
shouldPerformSegueWithIdentifier:sender:
não será chamado se o método acima retornar nulo, embora eu repita o teste acima apenas por completo.fonte
Para o Xcode 6.3:
fonte
Eu concordo com a resposta de Bryan
se eu fizer
as subvisões dentro da célula não serão interagidas pelo usuário.
No outro site, definindo
acionará o método didSelect, apesar de não atualizar a cor da seleção.
Usar willSelectRowAt é a maneira que resolvi meu problema. Exemplo:
fonte
além de
tableView.allowsMultipleSelection = true
você precisará desmarcar o restante das células da seção ao selecionar:fonte
para o swift 3.0, você pode usar o código abaixo para desativar a interação do usuário com a célula UITableView
fonte