Objetivo C, Como consultar se um objeto é de uma determinada classe
-
25-09-2019 - |
Pergunta
Estou derivando do TableViewCell. Quando consultar a exibição da tabela sobre um caminho de índice, ele retorna um uabableViewCell. Como encontro se esse objeto é um dos meus tipos personalizados "CustomCell"?
Solução
if ([cell isKindOfClass:[CustomCell class]]) {
[(CustomCell*)cell customCellMethod];
}
Outras dicas
if ([cell isKindOfClass:[CustomCell class]]) {
// ...
}
Como sempre no design orientado a objetos, tentar usar a identidade da classe de uma instância é um cheiro de código e deve aumentar uma bandeira. O que exatamente você está tentando fazer com sua célula personalizada? Talvez alguém possa sugerir uma abordagem melhor.
Não importa o quê, é um design muito melhor depender de uma interface (um @protocol
no Objective-C falam) do que uma classe, pois ajuda a dissociar seu design. Definir a @protocol
com a API relevante que você precisa e ter seu CustomCell
implementar esse protocolo. No seu código, você pode testar:
if([cell conformsToProtocol:@protocol(MyCellProtocol)]) {
//...
}
em vez de testar a identidade da classe.
Se você precisar apenas de um único método, pode usar [cell respondsToSelector:@selector(myMethod)]
.
Na verdade, existem dois métodos que você pode usar aqui. O que você provavelmente quer é isKindOfClass:
, mas há outro método chamado isMemberOfClass:
E isso só retornará YES
Se o receptor for uma instância da classe fornecida, não uma instância de uma subclasse.
Por exemplo, se DerivedClass
é uma subclasse de BaseClass
, então aqui estão os resultados de cada método:
BOOL isKind = [aDerivedInstance isKindOfClass:[BaseClass class]]; // YES
BOOL isMember = [aDerivedInstance isMemberOfClass:[BaseClass class]]; // NO