2013-02-17 5 views
1

이 말도 안되는 질문 일 수 있지만 나는 내보기 컨트롤러에이 같은 방법이 있습니다에액세스

[self registerProperty:self.currentUser]; 

하고 싶습니다 registerProperty:의 구현에 문자열 "currentUser"를 얻습니다.

실제 사용자 개체가 아니라 뷰 컨트롤러 "currentUser"의 속성을 관찰하고 싶기 때문에이 작업을하고 있습니다. 따라서 설정자를 가로 챌 수 있습니다. 내가보기 컨트롤러의 모든 속성의 목록은 오브젝티브 C 런타임을 확인하고 속성의 값이 currentUser 객체와 동일한 경우 체크하고있어 순간

:

-(void)registerProperty:(id)property 
{ 
    for (NSString *propertyName in [self allPropertiesOfClass:[property class]]) 
     if ([property isEqual:[self valueForKey:propertyName]]) 
      NSLog(@"The property passed into the method is %@", propertyName); 
} 

이의 문제 둘 다 동일한 사용자 객체를 포함하는 두 개의 속성을 가질 수 있습니다.이 경우 둘 중 하나가 해당 테스트를 통과하게됩니다. 어떻게 해결할 수 있을까요?

답변

2

속성을 관찰하려는 객체를 전달하고 속성 이름을 문자열로 전달하십시오. 즉, KVO -addObserver:... 메서드의 인수 (일부)를 미러링합니다.

+0

아 그래, 문제는 속성의 이름을 결정해야한다는 것입니다. 'self.arbitraryProperty'를'@ "arbitraryProperty"'문자열로 바꾸는 방법이 필요합니다. 예를 들어 [libextobjc] (https://github.com/jspahrsummers/libextobjc/blob/master/extobjc/EXTKeyPathCoding.h)에서 예를 들어 보았습니다.하지만 어떻게 작동하는지 전혀 이해하지 못합니다. – ntesler

+0

호출자는이를 전달해야합니다. 호출자는 속성 이름을 알고 있습니다. '[self registerProperty : self.currentUser]'를 사용해서는 안되며'[self registerObject : self property : @ "currentUser"]'와 같은 것을 사용해야합니다. –