2015-01-01 1 views
0

내가 일하고있는 프로젝트에서 일부 디버깅을 시도하고 특정 변수가 할당 된 ViewController의 종류를 알고 싶습니다. 그래서 난과 같이 if 문을 만들어 :'isSubclassOfClass'가 NSObject에서 정의되었을 때 유효한 선택자가 아닌 방법은 무엇입니까?

if ([controller isSubclassOfClass:[UINavigationController class]]) { 
     NSLog(@"It's a navigation controller!"); 

    } 

'컨트롤러'단지 DetailViewController가있는 UIViewController에서 상속하는 간단한 클래스입니다

DetailViewController *controller = (DetailViewController *)[[segue destinationViewController]topViewController]; 

을 사용하여 상기 생성됩니다. 그러나 컴파일러 오류가 발생했습니다. No visibile @interface for 'DetailViewController' declares the selector 'isSubclassOfClass:'

어떻게 가능합니까? 내가 트리플을 참조 할 때 isSubclassOfClass에 대한 참조는 NSObject에 정의 된 클래스 메소드라고 말합니다. 어떻게 DetailViewController는 모든 객체가 NSObject에서 상속되기 때문에 선택자를 알 수 없습니까 ??

답변

3

모두 다른 조치를 사용하여 인스턴스 메소드 -isKindOfClass:

if ([controller isKindOfClass:[UINavigationController class]]) { 
    NSLog(@"It's a navigation controller!"); 
} 

를 사용

는 당신에게 당신의 질문에 대한 정확한 답을 준,하지만 난 뭔가를 명확히하고 싶었다.

+로 시작하는 선언은 + CLASS 메소드입니다. 클래스 객체는 해당 클래스의 인스턴스가 아닌 해당 메소드를 구현합니다. 따라서이 방법 :

+ (BOOL)isSubclassOfClass:(Class)aClass 

클래스 방법입니다. 제프리 토마스는 그의 대답의 첫 부분에서 설명처럼

당신은 그것을 사용하십시오 :

[[controller class] isSubclassOfClass:[UINavigationController class]] 

[controller class] 비트는 컨트롤러 객체의 클래스 객체를 가져, 그리고 그 클래스 객체에게 isSubclassOfClass 메시지를 보냅니다. 이에

, 방법 isKindOfClass:

- (BOOL)isKindOfClass:(Class)aClass 

는 ... 인스턴스 메소드이다. 선언은 "+"대신 "-"로 시작하기 때문에 알 수 있습니다. 모든 메소드 선언의 시작 부분에 "+"또는 "-"을 찾아 클래스 메소드 또는 인스턴스 메소드인지 확인하십시오. 그리고 컴파일러가 문서에서 볼 수있는 메시지를 보내지 않으면 되돌아 가서 다시 확인하십시오. 나는 Objective-C로 꽤 많은 년 동안 프로그래밍을 해왔으며 아직도 가끔씩 물어 뜯는다.

[controller isKindOfClass:[UINavigationController class]] 
:

당신은 당신이 클래스 회원을 테스트 할 개체의 인스턴스에 isKindOfClass 메시지를 보내
2

내가 isSubclassOfClass에 대한 참조를 tripleTap 때 그것은 NSObject의에 정의 된 클래스 메소드 말한다.

이것은 클래스 메소드이며 인스턴스에서 사용하고 있습니다. 시도하십시오 isKindOfClass.

3

이 작업을 수행하는 표준 방법은 +isSubclassOfClass:이 아니라 -isKindOfClass:이 아니라 +isSubclassOfClass:을 사용할 수 있습니다. 수업 방법을 +isSubclassOfClass:

if ([[controller class] isSubclassOfClass:[UINavigationController class]]) { 
    NSLog(@"It's a navigation controller!"); 
}