2010-02-21 1 views
2

서툰 제목 죄송합니다. 어레이 컨트롤러를 '파생 된'속성 - KVO 문제에 바인딩 하시겠습니까?

내가 처음에 한 사람이 없었

, 나는 어레이 컨트롤러를 작성 appDelegate.person1.children에 바인딩 ... 사람의 아이들의 첫 번째 이름을 표시하는 간단한 UI를 상상 -이 괜찮 았는데 , 테이블 열을 바인딩하여 이름을 표시하는 것과 마찬가지입니다.

그러나 이후로 'person1'보다는 AppDelegate에서 배열이나 사람이 유지되도록 프로그램을 확장했습니다. 나는 (런타임 동안 ) 제대로 만들어 모든 것을 확인했다

- (Person *)person1{ 
    return [[self people] objectAtIndex:0]; 
} 

,하지만 난 할 수 없습니다 : 나는 단순히 PERSON1 그러나 속성을 유지하고, 목록의 첫 번째 항목을 반환하는 데 사용할 수 있다고 생각 person1의 키즈의 첫 번째 이름을 표시하도록 바인딩 된 테이블 열을 가져옵니다.

KVO와 뭔가? person 배열이 변경 될 때 person1이 변경되면 UI가 변경된다는 것을 테이블에서 알 수 있습니까?

감사

답변

1

은 어떻게 테이블이 알고 있는지 확인 않는 경우 인 배열 변경, 변경 (따라서 UI) PERSON1?

당신은 person1 속성의 값이 persons 속성 값에 의존 의미. 전자는 dependent key입니다.

따라서 @"persons"을 포함한 집합을 반환하려면 keyPathsForValuesAffectingPerson1을 구현하십시오.

또한 관찰 가능한 방식으로 속성 값을 변경해야합니다. 배열에 직접 말하면 잘라 내지 않습니다. 가치가 변했다는 것을 알 수있는 것은 아무것도 없습니다. Raj Pawan이 이미 언급했듯이, 한 가지 방법은 명시 적으로 가치있는 모든 가치 실현/변경보고를 보내는 것입니다.

나는 읽기와 쓰기 훨씬 쉽게 찾을 다른 방법은, (귀하의 경우는 persons 속성) 배열 속성에 대한 array accessor methods을 구현, 독점적 init의 외부 (배열 변이 이러한 접근을 사용하는 것입니다 및 dealloc). 접근 자에게 전화하면 KVO 알림이 무료로 제공됩니다. 여기에는 종속 키도 포함되어야합니다.

+0

고마워 피터 - 나는이 방법을 다음과 같이 가장 정확하고 확장 가능한 것으로 생각하고 있습니다. –

1

@ "나는 테이블이 알고 있는지 확인하려면 어떻게 그 때 사람의 배열 변경, PERSON1 변경 (따라서 UI)?" 바인더 제본 개체의

- (void)willChangeValueForKey:(NSString *)key 
    - (void)didChangeValueForKey:(NSString *)key 

: 당신은 당신이 사이에 그것을 할 수 있는지 확인 아이 배열을 변경 어디

.

처럼 :

[self willChangeValueForKey:@"children"]; 
[[self children] addObject: <some_new_child_object>]; // Add new child object to self.children 
[self didChangeValueForKey:@"children"]; 
+0

감사합니다.이 방법이 효과적이며 매우 신속하게 해결됩니다. –

+0

@Ben Packard 실제로 픽스입니다. 코드가 확장 가능하도록 Peter가 제안한대로 컬렉션 접근자를 구현해야합니다. 장래에 person2/person3 등의 하위 항목에 바인딩해야한다면 To-many Relationship이 유용 할 것입니다. –