0

서버 요청에서 검색된 새 데이터로 어레이 컨트롤러를 새로 고칠 때 문제가 있습니다.관찰 된 개체가 옵저버로 등록되지 않았습니다.

 
name 
age 
description 
widgetID 

그리고 몇 가지 속성을 가진 엔티티 객체 (이 MyWidget 전화) :

내가 엔티티 객체를 가지고있는 설정 몇 가지 속성을 가지고있는 (그것을 MyParent 전화) :

 
name 
size 
description 

크기는 NSSize 개체의 문자열 표현입니다. 핵심 데이터 저장소 및 서버에서 JSON으로 쉽게 저장 및 검색 할 수 있습니다. UI에서 크기를 나타 내기 위해 MyWidget을 서브 클래 싱하고 사용자 정의 클래스 및 getter를 사용자 정의 클래스의 범주로 제공했습니다 (이 작업을 수행하여 모델을 변경해야 할 경우 Xcode가 변경 사항을 덮어 쓰지 않습니다.)

-(void)setObjectWidth:(NSInteger)aValue { 
    [self setObjectSize:NSMakeSize(aValue, [self objectHeight])]; 
} 

-(void)setObjectHeight:(NSInteger)aValue { 
    [self setObjectSize:NSMakeSize([self objectWidth], aValue)]; 
} 

-(void)setObjectSize:(NSSize)aValue { 
    [self setSize:NSStringFromSize(aValue)]; 
} 

-(NSInteger)objectWidth { 
    return [self objectSize].width; 
} 

-(NSInteger)objectHeight { 
    return [self objectSize].height; 
} 

-(NSSize)objectSize { 
    return NSSizeFromString([self size]); 
} 

나는 상위의 분류 방법으로 widgetId에 조회를 수행하여 widget 얻을 :

-(MyWidget *)widget { 
    NSManagedObjectContext * moc = [[NSApp delegate] managedObjectContext]; 

    return [moc fetchObjectForEntityName:@"MyWidget" 
           withUID:[self widgetID]]; 
} 

fetchObjectForEntityName : withUID 관리되는 오브젝트 컨텍스트의 범주이다.

UI 내에 배열 컨트롤러가 MyParent의 tableView에 바인딩되어 있습니다. 적절한 값에 바인딩 된 UI의 세부 사항은 객체를 선물 선택 :

는 알 필요가 응용 프로그램의 다른 부분에 대한 통지를 해고 할 수 있도록 어레이 컨트롤러는 변화를 관찰
 
parentArrayController --> parentArray (managed objects in an array) 
parentTable --> parentArrayController.arrangedObjects.name 

uiWidthTextField --> parentArrayController.selection.widget.objectWidth 
uiHeightTextField --> parentArrayController.selection.widget.objectHeight 

선택한 개체는

모든 것이 잘 작동 작동 무엇

을 변경했습니다. UI 내의 텍스트 필드를 변경할 수 있으며 원하는대로 위젯에서 크기를 설정하고 가져옵니다. 상위 항목을 추가하는 것은 NSURLConnection을 만들고 해당 매개 변수를 서버에 보내는 간단한 작업입니다. 서버가 추가를 확인하면 부모 항목 목록을 서버에서 다시 요청합니다.

내려 오는 목록은 핵심 데이터의 기존 목록과 비교되고 새 항목을 추가하고 이미있는 다른 개체 값을 변경합니다. 목록이 다시 올 때

생겼습니다 어떤

, 그것은 올바르게 구문 분석되지만 응용 프로그램은 어레이 컨트롤러가 업데이트 될 때 불만 :

심각한 응용 프로그램 오류. 핵심 데이터 변경 처리 중에 예외가 발생했습니다. 관찰자로 등록되지 않았기 때문에 키 경로 "widget.objectHeight"에 대한 관찰자를 제거 할 수 없습니다. with userInfo (null)

"widget.objectHeight"키 경로가 관찰자로 등록되어 있지 않기 때문에 관찰자를 제거 할 수 없습니다.및 didChangeValueForKey이 : 다음 objectHeight 및 objectWidth의 세터 감싸, 그러나 이것은 어떤 의지를 제공하지 보인다 내가

나는 willChangeValueForKey를 추가하는 시도을 시도했다

.

IB가 widget.objectHeight에 바인딩되어 있고 위젯이 실제 KVO/KVC 속성과 달리 부모에서 조회이기 때문에 문제가 있다고 생각합니다. 그러나 나는 widget에 세터가 필요하지 않습니다.

나는 뭔가를 놓치고 있지만 그 위에 내 손가락을 놓을 수는 없다는 것을 알고있다.

탄원

어떤 도움이나이 문제를 해결 도움은 매우 극명하게 될 것이다!

답변

0

MyWidget의 모델이 아닌 속성으로 objectWidthobjectHeight을 설정해야합니다. objectWidthobjectHeight은 MyWidget의 키가 아니고 getters 및 setter 형식의 메소드 이름을 가지고 있기 때문에 KVO 문제가 발생했습니다. MyWidget 클래스에

@property() NSInteger objectWidth; 
@property() NSInteger objectHeight; 

및 그 KVO가 작동하려면 키를 제공해야

그냥 추가 할 수 있습니다. (내 재산 양식을 다시 확인하고 싶을 수도 있습니다. 나는 정수 속성을 써야했습니다.)

+0

감사합니다. 모델에 @property를 추가하려고 시도했지만 차이를 만들지 않았습니다. 그런 다음 각 setter/getter를 적절한 willChangeValue 및 willAccessValue로 래핑했습니다. 기쁨이 없습니다. 그런 다음 범주에서 벗어나 모델 객체로 직접 이동했습니다. 여전히 운이 없다 :-(당신이 지적한대로 실패라고 말할 수있는 가장 좋은 것입니다. 그리고 그것은 의미가 있습니다. 또한 자동 알림 autoNotifiesObserversForKey를 비활성화하고 해당 키 (objectHeight 등)에 대해 NO를 반환했습니다. – Hooligancat

+0

마침내 내 공개 된 문제를 해결하기 위해 돌아왔다. 당신의 솔루션이 작동했다. 나는 setter와 getter가 자동 알림을하지 않도록 설정했기 때문에 합성 된 setter와 getter가 KVC 알림을 실행하지 못한다는 사실을 깨닫지 못했다. 고마워! – Hooligancat

관련 문제