2012-08-23 3 views
1

이 관찰자에 대한 코딩 호환 키 값이 아닌 잘오류 :이 클래스는 키 Y

[self.tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; 

작동하지만이 하나의 오류를 생성합니다.

[self.tableView addObserver:self forKeyPath:@"contentOffset.y" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; 

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSConcreteValue 0x6e3eda0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key y.' 

왜?

답변

2

클래스에 속성으로 contentOffset이 존재하기는하지만 실제로는 CGPoint의 인스턴스입니다.이 클래스는 Objective-C 클래스가 아닌 일반 C 구조이므로 KVC를 준수하지 않습니다.

두 번째 예에서는 Objective-C 클래스처럼 다루고 있습니다.

업데이트

그것은 약간 혼란 스러울 수 있지만, 다시 예에 갈 수 있습니다

self.contentOffset  // contentOffset is a property of the current class 
self.contentOffset.y  // y is a member of the CGPoint structure of which contentOffset is an instance 

이 두 가지가 동일하게 보이지만 하나의 목표 - C 스타일이고, 다른 하나는 C- 스타일. C struct 이전에는 Objective-C이고 KVC는 구현하지 않았습니다. Objective-C는 C 위에 구축되어 있으므로 C에있는 모든 것이 Objective-C에도 있지만 역순은 적용되지 않는다는 것을 기억하십시오. Objective-C 클래스 속성에 액세스하는 것은 구조체의 멤버에 액세스하는 것과 동일한 구문을 사용하기 만하면됩니다.

당신은 아마 UIScrollView를 서브 클래 싱하고 있고 적절한 헤더 파일을 선택하면, 당신은 아마 assign 그것이 C 데이터 유형 의미합니다

@property (nonatomic, assign) CGPoint contentOffset; 

같은 것을 볼 수 있습니다. 또한 포인터를 나타내는 *이 없음을 유의하십시오.

struct CGPoint { 
    CGFloat x; 
    CGFloat y; 
}; 
typedef struct CGPoint CGPoint; 

당신이 볼 수 있듯이, CGPointNSObject에서 파생되지 않습니다

CGPoint의 선언

또한이 목표 - C 클래스 아님을 확인합니다.

+0

우리가 도트 구문을 사용한다면 이해할 수 있도록 contentOffset이 NSObject에서 상속되어야합니다. 내가 맞습니까? – Voloda2

+0

아닙니다. 내 편집 좀 봐. – dandan78

+1

@ Voloda2 KVO는 런타임에 NSObject의 하위 클래스를 만드는 데 의존합니다. 이러한 하위 클래스는 속성에 대한 setter 메서드를 재정의하고 setter가 호출 될 때 알림을 게시합니다. 구조체에는 setter 메서드가 없으므로 이러한 알림을 삽입 할 방법이 없으므로 인스턴스 변수를 직접 수정하는 경우와 같은 결과가됩니다.이 경우 KVO 알림은 없습니다 – wattson12

관련 문제