0

在界面生成器中,我創建了一個文本框並將一個NSNumberFormatter粘貼到單元格中。但是,用戶仍然可以在文本框中輸入文本。有什麼方法可以將輸入限制爲僅使用接口生成器的數字?我認爲這是NSNumberFormatter的要點。如何強制NSTextField只允許數字?

+0

見接受的答案爲[類似的問題(http://stackoverflow.com/questions/4652689/restrict-nstextfield-input-to-numeric-only-nsnumberformatter) – FluffulousChimp

+1

搜索 「的NSTextField只有數字」,你會找到很多答案。 – rdelmar

回答

0

每個格式有這個方法:

- (BOOL) getObjectValue: (id*) object forString: (NSString*) string 
    errorDescription: (NSError**) error; 

這是適用於所有的格式。
如果字符串無效,則返回false,並且作爲參數傳遞的對象(取消引用)將爲零。
因此,不要將數字格式化程序放到文本字段中,而要使用自己的格式化程序作爲實例變量。觀察實現委託協議的文本字段,以便在每次更改文本時都可以通知您。
然後調用此方法:

NSNumber* number; 
BOOL success=[formatter getObjectValue: &number forString: [myTextField stringValue] errorDescription:nil]; 

此時如果成功是假的(或檢查數爲零),則在文本字段一個無效的字符串,這樣做是比較適合你的行動(也許刪除整個字符串,或者顯示0.0作爲值)。

也有另一種方法:

- (BOOL) isPartialStringValid : (NSString*) partialString: (NSString*) partialString 
    errorDescription: (NSString*) error; 

這樣你就可以知道,如果部分字符串是valid.For例如用科學記數法「1E」是無效的,而且是部分有效,因爲用戶可能加1,它會變成「1e1」。

0

創建一個NSNumberFormatter子類並將其放入實現中。在您的代碼中,將YKKNumberFormatter設置爲NSTextField/UITextField的格式化程序。

@implementation YKKNumberFormatter 

- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error { 
    // Make sure we clear newString and error to ensure old values aren't being used 
    if (newString) { *newString = nil;} 
    if (error) {*error = nil;} 

    static NSCharacterSet *nonDecimalCharacters = nil; 
    if (nonDecimalCharacters == nil) { 
     nonDecimalCharacters = [[[NSCharacterSet decimalDigitCharacterSet] invertedSet] retain]; 
    } 

    if ([partialString length] == 0) { 
     return YES; // The empty string is okay (the user might just be deleting everything and starting over) 
    } else if ([partialString rangeOfCharacterFromSet:nonDecimalCharacters].location != NSNotFound) { 
     return NO; // Non-decimal characters aren't cool! 
    } 

    return YES; 
} 

@end