9

사용자 기본 설정을 나타내고 NSStringNSNumber을 캡슐화하는 간단한 모델 Foo이 있습니다. 나는 Foo 배열을 사용자 기본값으로 저장하여 응용 프로그램 시작 사이에 지속되도록하고 싶습니다. 사용자가 추가, 제거 및 편집 할 수 있도록 테이블보기로 표시하고 싶습니다. 이 문제에 대한 해결책은 바인딩과 관련하여 매우 단순 해 보였지만 실제 작업을 수행하는 것은 불가능하다는 사실이 입증되었습니다.NSUserDefaultsController에 바인딩 된 NSArrayController에 바인딩 된 편집 가능한 테이블 뷰

내 응용 프로그램이 시작되면 NSUserDefaults에 초기 Foo 배열의 키가있는 아카이브로 등록합니다. 내 XIB에서 콘텐츠 배열이 공유 사용자 기본값 컨트롤러의 values 컨트롤러 키에 바인딩 된 배열 컨트롤러가 있습니다. 키 경로는 foos입니다. '복합 값으로 내용 처리'가 선택되었습니다. 값 변환기로 NSKeyedUnarchiveFromData입니다. 그러면 테이블보기가 배열 컨트롤러 및 테이블 열에서 Foo의 속성으로 바운드됩니다.

Foo이 배열에서 추가 및 제거 될 때 완벽하게 작동합니다. 사용자 기본값의 foos 키가 배열의 새로운 내용을 반영하도록 업데이트됩니다. 문제는 개별 Foo의 속성을 변경해도 사용자 기본값으로 다시 기록되도록 배열을 트리거하지 않는다는 것입니다. 그 이유는 Key-Value Observing Programming Guide의 'Dependent Keys를 등록하는 것'의 'To-many Relationships'섹션에서 논의 될 것이라고 생각합니다. 배열 컨트롤러의 배열 자체에 대한 변경 사항은 관찰되지만 포함 된 요소의 속성에 대한 변경 사항은 없습니다. .

나는이 일을하기 위해 실제로 무엇을해야 할지를 이해할 수없는 문제로 이것을 인식하고 있음에도 불구하고. Foo의 변경 사항을 관찰 할 때 전체 어레이가 사용자 기본값 인 NSUserDefaults, NSUserDefaultsController, NSArrayController에 다시 쓰여지도록 어떤 개체에 알리고 어떤 메시지를 보내야합니까? Apple 문서에이 문제에 대한 간단한 언급이 있었으면하고 실제 문제를 해결하기위한 예제 코드를 제공했으면합니다. 모든 것을 시도했지만 마법의 주문을 찾을 수 없습니다.

이것은 How to get notified of changes to models via an NSArrayController과 비슷하지만 사용자 정의보기와 bind:toObject:withKeyPath:options:의 사용 사이에서 개념적 도약을 할 수 없습니다.

감사합니다. :)

+0

이것은 실제로 NSUserDefaults가 아닌 CoreData의 작업처럼 들립니다. –

+0

당신은 정교 할 수 있습니까? CoreData로 이것을 구현하기 시작하기 위해 소화해야 할 문서의 양에 대해서 생각해 보면 두통이 듭니다. 데이터 모델의 관점에서 볼 때, 내가하려는 것은 매우 직설적 인 것처럼 보입니다. CoreData의 복잡성 때문에 과장된 것처럼 보입니다. –

+0

잘 사용자 디폴트는 설정을위한 것이고 그것을 사용하여 데이터 모델을 사운드로 저장하려고합니다. CoreData는 실제로 간단한 데이터 모델을 가지고 있다면 그리 어렵지 않습니다. xcode에는 기본적으로 모든 설정을 수행하는 프로젝트 템플릿이 있습니다. 당신이 설명하는 문제도 해결해야합니다. –

답변

0

저는 iOS 개발자이기 때문에 코코아 바인딩을 지원하지 않는 IOS 때문에 누락 된 부분이 있다면 용서해주십시오.

내가 말할 수는 없지만 foos 배열에 대한 변경을 알리고 NSUserDefaults가 저장된 배열을 새로 고칠 수 있도록 Foo의 모든 속성이 수정되었을 때 알림을 받고 싶은 것처럼 들립니다. 그 맞습니까?

당신이 말했듯이, 어레이 자체를 수정하면 (즉, Foo의 내부 'foos'를 추가/삭제하면 성공적으로 변경을 알리는 것입니다.), 당신이해야 할 일이 해당 속성이 업데이트되면 언제든지 업데이트됩니다.

속성을 변경하면 KVO 알림을 실행하기 만하면됩니다. 기본적으로 Foo에서 설정자를 재정의 할 수 있습니다. 관심있는 속성 관찰하고 거기에 알림을 보내십시오.

하지만 어떻게 할 수 있습니까?KVO 알림을 보낼 수있는 일반적인 패턴은 같이 간다 (속성이라고 openingBalance을 위해 :. 당신이 재산 ', FOOS는'변화와 푸에 그 속성이 아니라 한 그 통지를 보낼

[self willChangeValueForKey:@"openingBalance"]; 
_openingBalance = theBalance; 
[self didChangeValueForKey:@"openingBalance"]; 

그러나 귀하의 경우 . 통지가 특정 속성 (또는 적어도 내가 알고있는 것)에 대해서만 있어야한다는 것은 아무것도 없습니다.하지만 Foo가 어딘가에 'foos'속성 내부에 구성되어 있음을 알리는 것을 원하지 않을 것입니다 else.

그냥 NSNotification을 사용하는 것이 어떨까요? Foo에서 업데이트 된 알림을 발생시키는 세분화 된 메서드를 만듭니다. 세터를 서브 클래 싱 한 다음 Foo 속성을 수정할 때마다이 알림을 발생시킵니다.

차례로 'foos'를 소유 한 객체 내부에서이 알림을 구독하고 NSUserDefaults를 직접 업데이트하거나 거기에서 'foos'에 대한 KVO 알림을 시작합니다.