2017-12-27 456 views
0

我對here & here中描述的文本字段具有自定義NSFormatter。我也有這個textfield的代表,並且我正從代表方法controlTextDidChange:訪問stringValue。有了這段代碼,當我嘗試編輯文本字段時,它不斷地從NSFormatter重置它的值,並使其不可編輯。在controlTextDidChange方法中使用自定義NSFormatter訪問NSTextField的`stringValue`使其不可編輯。

CustomFormatter.m

@implementation CustomFormatter 

- (BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString **)error { 
    float floatResult; 
    NSScanner *scanner; 
    BOOL returnValue = NO; 

    scanner = [NSScanner scannerWithString: string]; 
    [scanner scanString: @"$" intoString: NULL]; // ignore return value 
    if ([scanner scanFloat:&floatResult] && ([scanner isAtEnd])) { 
     returnValue = YES; 
     if (obj) { 
      *obj = [NSNumber numberWithFloat:floatResult]; 
     } 
    } else { 
     if (error) { 
      *error = NSLocalizedString(@"Couldn’t convert to float", @"Error converting"); 
     } 
    } 
    return returnValue; 
} 

- (NSString *)stringForObjectValue:(id)anObject { 

    if (![anObject isKindOfClass:[NSNumber class]]) { 
     return nil; 
    } 
    return [NSString stringWithFormat:@"$%.2f", [anObject floatValue]]; 
} 

@end 

MyDelegate.m

@interface MyController() <NSTextFieldDelegate> 
@property (weak) IBOutlet NSTextField *text1;  
@end 

@implementation MyController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do view setup here. 
} 

- (void)controlTextDidChange:(NSNotification *)obj { 
    NSLog(@"%@",[self.text1 stringValue]); 
} 
@end 
+0

你甚至沒有正確使用controlTextDidChange。 –

+0

你想用部分字符串做什麼?你想在用戶輸入「900」時處理「9」嗎? – Willeke

+0

@Willeke讓我們說我試圖過濾一個數據集作爲用戶輸入,例如當用戶鍵入'9'我想顯示一個以'9'開頭的結果集例如:900。 @El番茄你是什麼意思,我沒有正確使用'controlTextDidChange'?請詳細說明。 – cha77a

回答

0

你可以從field editor字符串,一個NSTextView。您可以從通知的用戶信息中獲取字段編輯器。

controlTextDidChange

被調用此方法時文本在控制如文本字段或形式的變化。控件發佈了一個textDidChangeNotification通知,並且如果控件的委託實現此方法,它將自動註冊以接收通知。使用鍵「NSFieldEditor」從通知對象的userInfo字典中獲取字段編輯器。

相關問題