2011-06-15 2 views
6

내가, 내가 각 속성에 하나씩 사용하여 다음을 추가하지 않고 그들 모두의 변화를 관찰 할 필요가 70 개 특성을 갖는 NSObject의 하위 클래스가 있습니다NSObject의 속성에 변화를 관찰하는 방법

[self addObserver: self 
     forKeyPath: @"propertyname" 
      options: NSKeyValueObservingOptionNew 
      context: NULL]; 

. 가장 쉬운 방법을 알려주십시오. 지금 당장은 10.5 이상의 솔루션이 필요합니다.

답변

10

objective-C 런타임 함수 class_copyPropertyList()을 사용하여 해당 클래스의 모든 속성을 가져온 다음 목록을 반복하고 property_getName()을 사용하여 키 값 관측과 함께 작동해야하는 항목을 얻을 수 있습니다.

또는 해당 클래스에 keyPathsForValuesAffectingValueForKey:을 구현할 수 있습니다. 클래스에서 새 키를 만드십시오. 변경 감지에만 사용합니다. 그런 다음 위의 메소드를 구현하고 문자열에 전달 된 키가 새 키와 같은 경우 70 개의 모든 속성 이름이 포함 된 세트를 리턴하십시오. 그런 다음 새 키에서 KVO를 수행하면 변경 사항이있을 때 알림을 받게됩니다. 이 방법을 사용하면 어떤 속성이 변경되었는지 알 수 없으며 그 중 하나만 변경되었습니다.

더 나은 디자인 패턴을 사용할 수 있으므로 왜해야하는지 알려주는 것이 좋습니다.

+0

귀중한 답변에 감사드립니다. 내 클래스 속성은 XIB의 여러 UI 컨트롤과 직접 바인딩됩니다. 사용자가 현재 UI 컨트롤의 변경 사항을 감지하고 현재 값을 저장하지 않고 주 XIB를 닫으면 변경 사항을 저장하도록 사용자에게 알릴 수 있도록해야합니다. 나는 당신이 언급하는대로 구현하려고 노력할 것이고, 그것이 저에게 효과가 있는지 알려줄 것입니다. – AmitSri

+0

그 유스 케이스를 감안할 때, 나는 이것을하기위한 더 좋은 방법이되고 싶습니다. 내가 NSObjectController 주위에 당신이 원하는 것을 않습니다 읽을 수 있었지만, 당신이 핵심 데이터를 사용하지 않는 상황에 대한 많은 정보를 찾을 수 없습니다. 나는 이것을 시도하지 않았지만 생각처럼 보입니다 : NSObjectController 서브 클래스를 만들고, IB에서 인스턴스를 만들고, NSObject가되도록 content 객체를 설정하십시오. 동일한 키를 사용하여 모든 UI를 NSObjectController에 바인딩하십시오. 그런 다음 코드에서 컨트롤러 하위 클래스의'objectDidEndEditing :'을 재정의하고 저장을 수행해야하는 클래스의 메소드를 호출합니다. –

+0

제안 해 주셔서 감사 드리며 앞으로 제안 사항을 변경할 수 있는지 확인하겠습니다. 현재, 제안한대로 keyPathsForValuesAffectingValueForKey를 구현했으며 현재 나를 위해 작동하는 것 같습니다. – AmitSri