2011-06-30 18 views
1

我有我的共享用戶默認的plist看起來像:NSValueTransformer不會被調用

menuItems (Array) 
    Item 0 (Dictionary) 
    name (String) "Menu Item 0" 
    show (Boolean) NO 
    Item 1 (Dictionary) 
    name (String) "Menu Item 1" 
    show (Boolean) YES 

等。

我有一個NSArrayController,其內容數組綁定到共享用戶默認值控制器與控制器鍵=「值」和模型關鍵路徑=「menuItems」。我有「處理內容作爲複合值」啓用。它的對象控制器模式是「類」,它控制的類名是NSMutableDictionary。

期望的結果是將NSMenuItems「hidden」屬性綁定到plist中的「show」條目。你會注意到,雖然,「隱藏」和「秀」是對立的,所以我創建了一個NSValueTransformer簡單地做:

return [NSNumber numberWithBool:!value]; 

我設置了綁定,如下所示,其中,「項目」是一個NSMenuItem, 「valueTransformer」是一個alloc'ed和init'ed變壓器,如上所述,和paneNum是其中合適的字典可以爲相應的菜單項中找到的索引:

NSDictionary *bindingOptions = [NSDictionary dictionaryWithObjectsAndKeys: 
     [NSNumber numberWithBool:YES], NSContinuouslyUpdatesValueBindingOption, 
     valueTransformer, NSValueTransformerBindingOption, 
     nil]; 
    [item bind:@"hidden" 
     toObject:[[defaultsController arrangedObjects] objectAtIndex:paneNum] 
    withKeyPath:@"show" 
     options:bindingOptions]; 

的結合似乎是工作於一定程度上;菜單項最初顯示或隱藏,但valueTransformer從不使用,因此每個菜單項的「隱藏性」都是向後的。 (順便說一句,如果plist改變了,菜單項「hiddenness」也不會自動更新,就像我期望的綁定一樣)。

我錯過了什麼?

順便說一句,我意識到在plist中存儲「隱藏」而不是「顯示」會更容易,但是現在我想明白爲什麼這不起作用。

編輯:我的猜測是,它與我試圖綁定到NSMutableDictionary中的對象的事實有關。如果是這種情況,那麼做到這一點的正確方法是什麼?

+0

你是如何創建'NSValueTransformer'的?你註冊了它的名字嗎? –

+0

由於我創建和實例(只是分配/初始化)和使用NSValueTransformerBindingOption我不認爲我需要註冊其名稱。我認爲這隻有在使用NSValueTransformerNameBindingOption時才需要。我已經嘗試了兩種方式,並且我的名字註冊成功了,因爲我可以通過NSValueTransformer查看它,但它仍然無效。 – devguydavid

回答

1

我剛剛結束了使用NSNegateBooleanTransformerName(我今天發現的東西)。我會假設在我的值轉換器中有些東西是愚蠢的,或者它試圖綁定到NSMutableDictionary作爲示例項目,我鞭撻過,沒有使用字典工作正常。

編輯:這是在我的變壓器的東西,因爲NSNegateBooleanTransformer工作正常,即使在混合字典。 (無論如何,這裏的衝突都沒有意義)。

我很想有人解釋爲什麼一個基於上述代碼的值轉換器(應該與NSNegateBooleanTransformer相同)不起作用,並且我會改變接受的答案。

+1

我看不到變壓器的所有代碼,所以這是一個猜測。在你原來的方法中,你正在否定'價值'。但是不是類型id的值?你不必先轉換爲布爾,然後否定布爾,然後轉換回數字? – sam

+0

感謝您的評論。這可能是罪魁禍首!不幸的是,我不再能夠訪問該代碼來檢查。 – devguydavid