2012-02-01 18 views
1

我無法制作動態單位轉換器。我有兩個文本字段:一個用於「英寸」,另一個用於「腳」。我的目標是在輸入數字時將英寸轉換爲英尺,反之亦然。我希望動作發生動態,而不是當按下「Enter」或「Tab」按鈕時。動態更新NSTextField中的數字

我正在使用Number Formatter的NSTextField。所以我需要格式化程序在計算髮生時也可以工作。我已經嘗試了 - (void)controlTextDidChange方法,但格式化程序不能使用它。

請參閱下面的我的當前代碼,它不能動態工作。

#import <Foundation/Foundation.h> 

@interface Convert : NSObject { 
    IBOutlet NSTextField *inches; 
    IBOutlet NSTextField *feet; 
} 

- (IBAction)textDidChange:(id)sender; 

@end 

#import "Convert.h" 

@implementation Convert 

- (IBAction)textDidChange:(id)sender { 

    if (sender == inches) { 
     float myInches = [inches floatValue]; 
     [feet setFloatValue: (myInches/12)]; 
    } 
    else if (sender == feet) { 
     float myFeet = [feet floatValue]; 
     [inches setFloatValue: (myFeet*12)]; 
    } 
} 

@end 

誰能告訴我如何做到這一點,而不必按 「Enter」 或 「Tab」 鍵?

...現在嘗試使用替代的NSTextField NSForm的NSValueTransformer辦法...

#import <Foundation/Foundation.h> 

@interface LengthConverter : NSValueTransformer 

+ (Class)transformedValueClass; 
+ (BOOL)allowsReverseTransformation; 

- (id)transformedValue:(id)value; 
- (id)reverseTransformedValue:(id)value; 

@end 

#import "LengthConverter.h" 

@implementation LengthConverter 

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

+ (BOOL)allowsReverseTransformation { 
    return YES; 
} 

- (id)transformedValue:(id)value { 
    if (value == nil) return nil; 

    if (![value respondsToSelector: @selector(doubleValue)]) { 
     [NSException raise:NSInternalInconsistencyException format:@"Value does not respond",[value class]]; 
    } 

    CGFloat inchesInputValue = [value doubleValue]; // handles NSString and NSNumber 
    CGFloat feetOutputValue = inchesInputValue/12; 

    return [NSNumber numberWithDouble: feetOutputValue]; 
} 

- (id)reverseTransformedValue:(id)value { 
    if (value == nil) return nil; 

    if (![value respondsToSelector: @selector(doubleValue)]) { 
     [NSException raise:NSInternalInconsistencyException format:@"Value does not respond",[value class]]; 
    } 

    CGFloat feetInputValue = [value doubleValue]; // handles NSString and NSNumber 
    CGFloat inchesOutputValue = feetInputValue * 12; 

    return [NSNumber numberWithDouble: inchesOutputValue]; 
} 

@end 

回答

2

可以使用NSValueTransformer小號綁定值。

NSValueTransformer提供對象到對象轉換,您還可以在XIB和綁定中使用該對象。系統定義了一些,你可以很容易地定義你自己的。 Apple的TemperatureConverter樣本將是介紹NSValueTransformer的一個很好的起點。響應

更新品嚐

+ [ApplicationDelegate initialize],你會看到程序註冊所有需要的變壓器。他們註冊一個名稱,如@"centrigradeFromKelvin"

一旦你需要註冊的trafos,你可以在NIB中使用變壓器。在TemperatureConvertoer例子,可以:

  1. 導航到表格單元
  2. 選擇窗體細胞 - 攝氏
  3. 按CMD +選擇+ 7,以查看所述字段綁定
  4. 的值綁定到SharedDefaults中的值 - 值轉換器設置爲「centrigradeFromKelvin」。
+0

你能詳細說明我如何在我的代碼中實現NSValueTransformer嗎?我以前從未使用過它們。 – wigging 2012-02-01 02:55:53

+0

@Gavin更新回答 – justin 2012-02-01 03:31:54

+0

如何在綁定中聲明「模型關鍵路徑」? – wigging 2012-02-01 05:48:21