4

값 변환기가있는 바인딩에 의해 채워지는 팝업 버튼이 보이는 방식인지 여부는 알 수 없습니다. 이상하게 보입니다 (적어도 값 변환기 및 테이블 뷰에서 보았던 것과 관련하여) transformationValue : 메서드의 "value"매개 변수는 배열의 개별 문자열이 아니라 배열 컨트롤러에 바인딩 된 전체 배열입니다. 테이블 뷰를 사용하여이 작업을 수행하면 표에 표시된 각 행에 대해 변압기가 한 번 호출되고 "값"매개 변수는 내용 배열로 사용되는 전체 배열이 아닌 해당 행 및 열에 바인딩되는 객체입니다 어레이 컨트롤러의 경우.NSPopupButton 값 변환기가있는 바인딩

나는 이것을 테스트하는 매우 간단한 응용 프로그램을 가지고 있습니다. RDTransformer 클래스에서

+(void)initialize { 
    RDTransformer *transformer = [[RDTransformer alloc] init]; 
    [NSValueTransformer setValueTransformer:transformer forName:@"testTransformer"]; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    self.theData = @[@{@"name":@"William", @"age":@"24"},@{@"name":@"Thomas", @"age":@"23"},@{@"name":@"Alexander", @"age":@"64"},@{@"name":@"James", @"age":@"47"}]; 
} 

이있다 : 응용 프로그램 위임이있다 IB에서

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


+(BOOL)allowsReverseTransformation { 
    return NO; 
} 

-(id)transformedValue:(id)value { 
    NSLog(@"%@",value); 
    return value; 
} 

, 나는 윈도우와 객체 목록에 어레이 컨트롤러에 NSPopupButton을 추가했다. 컨트롤러의 내용 배열은 App Delegate.theData에 바인딩되고 팝업 버튼의 내용 값은 값 변환기 인 testTransformer를 사용하여 Array Controller.arrangedObjects.name에 바인딩됩니다. 나는이 프로그램을 실행하면

는 transformedValue에서 로그 :

2012-09-19 20:31:39.975 PopupBindingWithTransformer[793:303] (
) 
2012-09-19 20:31:40.019 PopupBindingWithTransformer[793:303] (
    William, 
    Thomas, 
    Alexander, 
    James 
) 

이 내가 SO에 볼 수있는 다른 사람의 경험이 될 것 같지 않습니다 : 방법이입니다. 바인딩이나 밸류 트랜스 포머에서 내가 잘못하고있는 것이 있습니까?

답변

4

불행히도, 이것이 NSPopUpButton의 작동 방식입니다. 문제는 해당 제어에만 국한되지 않습니다. NSArrayController.contentArray를 다른 NSArrayControllers.arrangedObject.someProperty에 바인딩하면 동일한 문제가 발생합니다. 여기에 테이블 및 팝업 모두 작동하게 내 모든 값 변압기에서 사용하는 간단한 해결 방법은 다음과 같습니다

다음과 같은 방법으로 값 변압기를 수정할 수 있습니다

-(id)transformedArrayValue:(NSArray*)array 
{ 
    NSMutableArray *result = [NSMutableArray array]; 
    for (id value in array) 
     [result addObject:[self transformedValue:value]]; 

    return result; 
} 

-(id)transformedValue:(id)value 
{ 
    if ([value isKindOfClass:[NSArray class]]) 
     return [self transformedArrayValue:value]; 

    // Do your normal-case transform... 
    return [value lowercaseString]; 
} 

그것은 완벽 하진하지만 복제가 쉽습니다. 실제로 transformedArrayValue:을 클래스 범주에 넣어서 사방에 복사 할 필요가 없습니다.

+0

그래, 나는 변압기가 팝업 버튼으로 작동하도록 비슷한 것을했다. 배열을 반환하고 처리하면 배열을 반환 할 수 있습니다. 나는 다음 며칠 동안 다른 것이 들어올 지 지켜 볼 것입니다. 그렇지 않다면 나는 당신의 대답을 받아 들일 것입니다. – rdelmar

+0

와우, 고마워! ** 도대체 ** 어디에서 문서화되어 있습니까? 정말로, 행성에서 가장 가치있는 회사에 대한 정말 가난한 직업 .. – Jay