Tenho um UITableViewCell
que está vinculado a um objeto e preciso saber se a célula está visível. A partir da pesquisa que fiz, isso significa que preciso acessar de alguma forma o UITableView
que o contém (a partir daí, existem várias maneiras de verificar se ele está visível). Então, eu gostaria de saber se UITableViewCell
tem um ponteiro para o UITableView
, ou se havia alguma outra maneira de obter um ponteiro da célula?
100
[cell superView]
talvez?Respostas:
Para evitar a verificação da versão do iOS, percorra iterativamente as visualizações da célula até que um UITableView seja encontrado:
fonte
@property (weak, nonatomic) UITableView *tableView;
etableView:cellForRowAtIndexPath:
apenas no conjuntocell.tableView = tableView;
.No iOS7 beta 5
UITableViewWrapperView
é a visão geral de aUITableViewCell
. TambémUITableView
é superview de aUITableViewWrapperView
.Portanto, para iOS 7, a solução é
UITableView *tableView = (UITableView *)cell.superview.superview;
Portanto, para iOSes até iOS 6, a solução é
UITableView *tableView = (UITableView *)cell.superview;
fonte
UITableViewCell
categoria com um novo método,relatedTableView
que faz uma verificação para uma versão do iOS e retorna o superView apropriado.Extensão Swift 5
Recursivamente
Usando loop
fonte
view != nil
cheque antes de desembrulhar. Atualizado para um código mais limpoAntes do iOS7, a visão geral da célula era o
UITableView
que o continha. A partir do iOS7 GM (provavelmente também estará no lançamento público), a supervisão da célula é uma,UITableViewWrapperView
com sua supervisão sendo oUITableView
. Existem duas soluções para o problema.Solução nº 1: crie uma
UITableViewCell
categoriaEste é um bom substituto imediato para usar
cell.superview
, torna mais fácil refatorar seu código existente - apenas pesquise e substitua[cell relatedTable]
, e coloque uma declaração para garantir que, se a hierarquia de visualização mudar ou reverter no futuro, ela aparecerá imediatamente em seus testes.Solução # 2: Adicionar uma
UITableView
referência fraca aUITableViewCell
Este é um design muito melhor, embora exija um pouco mais de refatoração de código para usar em projetos existentes. Em seu
tableView:cellForRowAtIndexPath
uso SOUITableViewCell como sua classe de célula ou certifique-se de que sua classe de célula personalizada é uma subclasse deSOUITableViewCell
e atribua tableView à propriedade tableView da célula. Dentro da célula, você pode então referir-se ao tableview que o contém usandoself.tableView
.fonte
[self.superview.superview isKindOfClass:[UITableView class]]
deve ser o primeiro, porque o iOS 7 é cada vez mais.Se estiver visível, tem uma visão geral. E ... surpresa ... o superview é um objeto UITableView.
No entanto, ter uma supervisualização não é garantia de estar na tela. Mas UITableView fornece métodos para determinar quais células são visíveis.
E não, não há nenhuma referência dedicada de uma célula a uma tabela. Mas quando você subclasse UITableViewCell você pode introduzir um e configurá-lo na criação. (Eu mesmo fiz muito isso antes de pensar na hierarquia de subvisualização.)
Atualização para iOS7: a Apple mudou a hierarquia de subvisualização aqui. Como de costume, ao trabalhar com coisas que não são documentadas detalhadamente, há sempre o risco de que as coisas mudem. É muito mais seguro "rastrear" a hierarquia de visualizações até que um objeto UITableView seja finalmente encontrado.
fonte
Solução Swift 2.2.
Uma extensão para UIView que procura recursivamente por uma visualização com um tipo específico.
ou mais compacto (graças ao kabiroberai):
No seu celular você apenas chama:
Lembre-se de que UITableViewCell é adicionado ao UITableView somente após a execução de cellForRowAtIndexPath.
fonte
lookForSuperviewOfType:
corpo do método em uma linha, tornando-o ainda mais rápido:return superview as? T ?? superview?.superviewOfType(type)
O que quer que você consiga fazer ao chamar super view ou por meio da cadeia de resposta será muito frágil. A melhor maneira de fazer isso, se as células querem saber algo, é passar um objeto para a célula que responde a algum método que responda à pergunta que a célula quer fazer e fazer com que o controlador implemente a lógica de determinar o que responder (pela sua pergunta, acho que a célula quer saber se algo está visível ou não).
Crie um protocolo de delegado na célula, defina o delegado da célula como tableViewController e mova toda a lógica de "controle" da interface do usuário no tableViewCotroller.
As células da visualização da tabela devem ser uma visualização que exibirá apenas informações.
fonte
Criei uma categoria em UITableViewCell para obter seu tableView pai:
melhor,
fonte
Aqui está a versão do Swift com base nas respostas acima. Eu generalizei
ExtendedCell
para uso posterior.Espero que esta ajuda :)
fonte
Eu baseei essa solução na sugestão de Gabe de que o
UITableViewWrapperView
objeto é a supervisão doUITableViewCell
objeto no iOS7 beta5.Subclasse
UITableviewCell
:fonte
Eu peguei emprestado e modifiquei um pouco da resposta acima e cheguei ao seguinte trecho.
A passagem em classe oferece a flexibilidade para percorrer e obter visualizações diferentes de UITableView em algumas outras ocasiões.
fonte
Minha solução para esse problema é um pouco semelhante a outras soluções, mas usa um elegante for-loop e é curto. Também deve ser à prova de futuro:
fonte
for (view = self.superview; view && ![view isKindOfClass:UITableView.class]; view = view.superview);
fonte
Em vez de superview, tente usar ["UItableViewvariable" visibleCells].
Usei isso em loops foreach para percorrer as células que o aplicativo viu e funcionou.
Funciona como um encanto.
fonte
Testado minimamente, mas este exemplo não genérico de Swift 3 parece funcionar:
fonte
este código
`UITableView *tblView=[cell superview];
lhe dará uma instância da UItableview que contém a célula de visualização da guiafonte
Eu sugiro que você atravesse a hierarquia de visualizações desta maneira para encontrar o UITableView pai:
Caso contrário, seu código será interrompido quando a Apple alterar a hierarquia de visualização novamente .
Outra resposta que também atravessa a hierarquia é recursiva.
fonte
http://www.curiousfind.com/blog/646 Obrigado
fonte
Você pode obtê-lo com uma linha de código.
fonte
fonte
da resposta de @idris escrevi uma expansão para UITableViewCell em Swift
fonte