1

코코아 바인딩을 사용하여 NSTableView 행에 일대 다 또는 다 대다 관계를 표시 할 수 있는지 알고 싶습니다.코코아 바인딩을 NSTableView 및 다 대다 관계와 함께 사용할 수 있습니까?

내가하려는 것은 행마다 하나의 엔티티를 표시하고 다른 엔티티의 속성을 두 개 이상 보여주고 싶습니다.

Name | Birth | Address | tag 
-------------------------------------------------------- 
jon 75/12/13 123 street handyman, contractor 
paul 53/03/20 53 avenue 1 contractor, swimmer, biologist 

가 가능하다조차 :

사람 < --- >> 태그

한 행이 다음과 같아야합니다

현재 내 스키마는 다음과 같이인가?

답변

3

이렇게 할 수있는 방법이 몇 가지 있습니다. 논의를 위해 일대 다 관계의 컬렉션 속성 tags을 가정합니다. 이 종류이기 때문에

+ (NSSet*)keyPathsForValuesAffectingTagList 
{ 
    return [NSSet setWithObject:@"tags"]; 
} 
- (NSString*) tagList 
{ 
    return [[self.tags sortedArrayUsingSelector:@selector(localizedStandardCompare:)] componentsJoinedByString:@", "]; 
} 

(tags가 배열이 아닌 설정되어있는 경우, 당신은 self.tags.allObjects을 사용하십시오.)

:

당신은 태그 목록 문자열입니다 종속 속성을 만들 수 있습니다 태그 목록이 뷰에 표시되는 방법과 관련하여 모델 레이어보다 뷰 레이어의 더 많은 부분으로 간주 될 수 있습니다. 따라서 이러한 메소드를 클래스 자체가 아닌 클래스의 범주에 정의 할 수 있습니다.

또 다른 방법은 값 변환기 클래스를 사용하여 동일한 작업을 수행하는 것입니다. 텍스트 필드를 tags 컬렉션 속성에 바인딩하지만 사용자 지정 값 변환기 클래스의 이름을 지정합니다. 이 클래스는 컬렉션 클래스 (배열 또는 집합)에서 변형되어 위와 비슷한 방식으로 문자열을 생성합니다.

@interface TagListTransformer : NSValueTransformer {} 
@end 

@implementation TagListTransformer 

+ (Class) transformedValueClass 
{ 
    return [NSString class]; 
} 

+ (BOOL) allowsReverseTransformation 
{ 
    return NO; 
} 

- (id) transformedValue:(id)value 
{ 
    return [[value sortedArrayUsingSelector:@selector(localizedStandardCompare:)] componentsJoinedByString:@", "]; 
} 

@end 
+0

참고 : 태그 이름이 변경되면 태그 목록이 자동으로 새로 고쳐지지 않습니다. – Willeke

+0

@Willeke, 어떤 의미로? 태그 목록은 요청할 때마다 재생성됩니다. '+ keyPathsForValuesAffectingTagList' 메쏘드는 KVO가'tags '가 KVO 호환 방식으로 바뀔 때마다'tagList'를 위해 변경 알림을 내 보내야한다는 것을 KVO가 알도록합니다. 값 변환자를 사용하면 바인딩이'tags '를 직접 관찰하고 바뀔 때 바운드 뷰가 자동으로 업데이트되고 변환기를 사용하여 태그 목록을 가져와 최신 상태가됩니다. –

+0

죄송합니다. 너무 멀리 생각하고 있습니다. 태그가 문자열 배열 인 경우 작동합니다. 내가 생각하기에 너무 많은 코어 데이터를 수행했다. – Willeke

관련 문제