이렇게 할 수있는 방법이 몇 가지 있습니다. 논의를 위해 일대 다 관계의 컬렉션 속성 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
참고 : 태그 이름이 변경되면 태그 목록이 자동으로 새로 고쳐지지 않습니다. – Willeke
@Willeke, 어떤 의미로? 태그 목록은 요청할 때마다 재생성됩니다. '+ keyPathsForValuesAffectingTagList' 메쏘드는 KVO가'tags '가 KVO 호환 방식으로 바뀔 때마다'tagList'를 위해 변경 알림을 내 보내야한다는 것을 KVO가 알도록합니다. 값 변환자를 사용하면 바인딩이'tags '를 직접 관찰하고 바뀔 때 바운드 뷰가 자동으로 업데이트되고 변환기를 사용하여 태그 목록을 가져와 최신 상태가됩니다. –
죄송합니다. 너무 멀리 생각하고 있습니다. 태그가 문자열 배열 인 경우 작동합니다. 내가 생각하기에 너무 많은 코어 데이터를 수행했다. – Willeke