2010-04-08 2 views

답변

3
if ([cell isKindOfClass:[CustomCell class]]) { 
    [(CustomCell*)cell customCellMethod]; 
} 
2
if ([cell isKindOfClass:[CustomCell class]]) { 
    // ... 
} 
1

은, 코드 냄새와 플래그를 제기해야한다. 사용자 지정 셀을 사용하여 정확히 무엇을하려합니까? 아마도 누군가가 더 나은 접근법을 제안 할 수 있습니다.

아니요, 디자인을 분리하는 데 도움이되므로 클래스보다는 클래스 (Objective-C에서는 @protocol)에 의존하는 것이 훨씬 더 좋은 디자인입니다. 필요한 API로 @protocol을 정의하고 CustomCell에서 해당 프로토콜을 구현하도록하십시오. 그런 다음 코드에서 다음을 테스트 할 수 있습니다.

if([cell conformsToProtocol:@protocol(MyCellProtocol)]) { 
    //... 
} 

클래스 ID 테스트가 아닌.

단일 방법 만 필요한 경우 [cell respondsToSelector:@selector(myMethod)]을 사용할 수 있습니다.

+1

나는 유스 케이스는이 경우에 매우 분명하다 생각합니다. 특히 ObjectiveC 타이핑이 작동하는 방식. 당신은'UITableViewCell'의 다양한 서브 클래스의 셀로 채워진 테이블 뷰를 가지며,'[tableView cellForRowAtIndexPath : indexPath]'를 요구합니다. 그 테이블 뷰 메소드는 단지'UITableViewCell'의 인스턴스를 반환 할 것이고, 당신이 그 셀의 서브 클래스를 가지고 있는지를 알 수있는 유일한 방법은 그 클래스를 테스트하는 것입니다. 프로토콜을 만들 수도 있지만, 대부분의 사용자 정의 셀 메소드를 어쨌든 배치 할 것이므로 명백한 이점은 거의 없을 것입니다. –

0

여기 실제로 사용할 수있는 두 가지 방법이 있습니다. 당신이 원한 것은 isKindOfClass:이지만, isMemberOfClass:이라는 또 다른 방법이 있는데, 수신기가 하위 클래스의 인스턴스가 아니라 제공된 클래스의 인스턴스 인 경우에만 YES을 반환합니다. DerivedClassBaseClass의 서브 클래스 인 경우 예를 들어

, 여기에 각 방법의 결과는 다음과 같습니다

BOOL isKind = [aDerivedInstance isKindOfClass:[BaseClass class]]; // YES 
BOOL isMember = [aDerivedInstance isMemberOfClass:[BaseClass class]]; // NO 
관련 문제