4

我不知道我用彈出式按鈕看到的與值轉換器綁定的方式是否應該如此 - 我看到的不尋常的事情(至少尊重我看到的使用值轉換器和表視圖)是因爲transformedValue:方法中的「value」參數是綁定到數組控制器的整個數組,而不是數組中的單個字符串。當我使用表視圖完成此操作時,將爲表中的每個顯示行調用轉換器一次,而「value」參數是綁定到該行和列的任何對象,而不是充當內容數組的整個數組爲陣列控制器。帶有值轉換器的NSPopupButton綁定

我有一個非常簡單的應用程序來測試這個。在應用程序委託有這樣的:

+(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"}]; 
} 

在RDTransformer類是這樣的:

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


+(BOOL)allowsReverseTransformation { 
    return NO; 
} 

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

在IB,我加入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