문제

NSCODING/PLIST 기반 보관에서 핵심 데이터 사용에 이르기까지 고대 코드 (10.2 ERA)를 포팅하려고합니다. 사용자 정의 nstextfieldcell이있는 nsoutlineview가 있습니다. 개요보기는 NStreecontroller에 바인딩되어 데이터를 제공합니다.

바인딩 모델은 다음과 같습니다.

nstreecontroller : 관리 객체 컨텍스트 -> 컨트롤러 .managedObjectContext

NSOUTLINEVIEW의 NSTABLECOLUMN 값 -> 트리 컨트롤러 : ARPEREDOBJECTS : itemDictionary

NSoutlineView에는 텍스트 필드 옆에 이미지를 추가하는 사용자 정의 NstextFieldCell 서브 클래스가 있으므로 NSManagedObject의 값을 ItemDictionary라는 NSMutableDictionary로 전달하여 제목을 끌어 내고 설정하고 키 값을 설정할 수 있습니다.

문제가 발생하는 경우 텍스트 필드의 값을 업데이트하고 관리되는 객체 인스턴스로 변경 한 값을 전달하는 것입니다. 사용자가 제목 값을 두 번 클릭하고 편집 한 후에는 전달됩니다. -(id)objectValue, 그러나 다음 단계가 NSManagedObject 인스턴스로 업데이트를 전파하는 것이 무엇인지 잘 모르겠습니다. NstextFieldCell 서브 클래스에서 값을 읽고 설정하기 위해 지금까지 가지고있는 코드는 다음과 같습니다.

- (void)setStringValue:(NSString *)aString {
  [super setObjectValue:aString];
}

- (void)setObjectValue:(id <NSCopying>)anObject {  
  id cellValues = anObject;

  [super setObjectValue:[cellValues valueForKey:@"title"]];
  [self setCheckState:[[cellValues valueForKey:@"isChecked"] integerValue]];
}

- (id)objectValue {
  return [super objectValue];
}
도움이 되었습니까?

해결책

나는 주변에 물었다. 그리고 이것은 누군가가 내게 준 추천이다. 합리적으로 보입니다.

NSCELL 서브 클래스에서 새로운 값을 설정하면 이벤트 루프에 의해 호출되는 메소드에서 다음과 같은 작업을 수행하십시오.

- (void)whateverMethodInCellSubclassIsTriggeredByEventLoop:(id)value {
    NSTableView *tableView = [self controlView];
    NSTableColumn *column = [[tableView tableColumns] objectAtIndex:[tableView editedColumn]];
    NSInteger rowIndex = [tableView editedRow];
    NSDictionary *bindingInfo = [column infoForBinding:NSValueBinding];
    id modelObject = nil;

    if ([controlView isKindOfClass:[NSOutlineView class]]) {
        NSTreeNode *item = [outlineView itemAtRow:rowIndex];
        modelObject = [item representedObject];
    } else if ([controlView isKindOfClass:[NSTableView class]]) {
        NSArrayController *controller = [bindingInfo objectForKey:NSObservedObjectKey];
        modelObject = [[controller arrangedObjects] objectAtIndex:rowIndex];
    }

    [modelObject setValue:value forKeyPath:[bindingInfo objectForKey:NSObservedKeyPathKey]];
}

이것은 테이블 열에서 사용 가능한 바인딩 정보를 활용하여 모델 객체와 변경 사항을 푸시 해야하는 주요 경로를 가져오고 일반 KVC를 사용하여 변경 사항을 푸시하는 상당히 일반적인 코드입니다. 테이블과 개요 뷰 모두뿐만 아니라 임의의 모델 객체, 핵심 데이터 여부에 맞게 작동해야합니다.

다른 팁

나는 아마도 다른 방식으로 이것에 접근 할 것입니다. outlineView:willDisplayCell:forTableColumn:item: 셀 서브 클래스 내에서보다는 셀의 ischecked 속성을 위임하는 방법 및 셀의 ischecked 속성을 설정합니다. 그런 다음 해당 열을 배열로 직접 바인딩하면 기본 편집 메커니즘이 관리되는 객체 인스턴스에서 속성을 설정하는 것을 관리합니다.

iirc, the item 통과하는 매개 변수는 실제로 representEdObject 속성이 해당 행의 nsmanagedObject 인스턴스를 제공하는 nstreenode 인스턴스가되므로 필요한 정보를 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top