2010-09-29 66 views
1

這裏是我的設置:綁定返回默認值(與registerDefaults設置:)而不是零

  • myTextField勢必在共享用戶默認控制器的關鍵。用戶只能在文本字段中輸入數字。
  • 每當我的應用程序加載時,我使用[[NSUserDefaults standardUserDefaults] registerDefaults: ... ]加載默認首選項(從應用程序的資源文件夾)。
  • myMenuItem的標題綁定到共享用戶默認值控制器中的相同密鑰。

問題:

myTextField是空的,myMenuItem接收使用registerDefaults:,而不是表示空領域的一些值加載默認值(我所期望的0或nil)。

例如,當NSTextField爲空時,菜單項會收到「2」,即使用registerDefaults:加載的值,而不是某個值,表示該字段爲空。

如果我對registerDefaults:代碼發表評論,那麼當我在NSTextField中沒有任何內容時,綁定返回nil

我試圖解決許多綁定的設置以及實驗佔位符值,我查看了可可綁定和用戶默認文檔,但找不到解決方案。

預期的行爲:

  • 當文本字段爲空,我想myMenuItem,以反映而不是使用使用registerDefaults:註冊的默認值。

任何幫助將不勝感激。

回答

2

我從漂亮的人一些提示在irc.freenode.org #macdev,發現下面是解決我的問題:

(在我的情況或NSNumberFormatter)創建NSFormatter的子類和壓倒一切getObjectValue:forString:errorDescription:覆蓋默認行爲返回nil(使綁定使用註冊的默認值),而不是在文本字段爲空時返回0。

- (BOOL)getObjectValue:(id *)anObject forString:(NSString *)string errorDescription:(NSString **)error { 
    if ([string isEqualToString:@""]) { 
     *anObject = [NSNumber numberWithInt:0]; 
     return YES; 
    } else { 
     return [super getObjectValue:anObject forString:string errorDescription:error]; 
    } 
} 

NSValueTransformer子類的逆向轉換方法也適用於此。

1

注意:

上述解決方案不適用於字符串。也就是說,如果你的userDefault值是一個字符串,你已經綁定的是一個的NSTextField的價值,你繼承NSFormatter並做到這一點:

- (BOOL)getObjectValue:(id *)anObject forString:(NSString *)string errorDescription:(NSString **)error { 
    if ([string isEqualToString:@""]) { 
     *anObject = nil; 
    } 
    return YES; 
} 

你會發現,當的NSTextField是空的,綁定被設置爲您最初使用-registerDefaults註冊的任何值:而不是空字符串或零值。我試圖使用* anObject = [NSNull null];同樣,但這也不起作用---綁定仍然設置爲原始默認值。

我結束了設置* anObject = @「」; (具有單個空格的字符串),以便當textField爲空時,userDefaults pList中的值設置爲字符串:@「」。然後檢查使用該userDefault值並正確響應的字符串(忽略單個空間並將其視爲userDefault值爲空)。

這是一個醜陋的黑客攻擊,但目前我可以找到解決此問題的唯一方法。我在這裏發佈它,以防其他人在這個線程上絆倒。如果你問我,將NSTextField綁定到userDefault應該是血腥的,並且在textField爲空時將userDefault設置爲空字符串!爲什麼蘋果選擇這樣做的方式超出了我的想象。