Ecco un'implementazione alternativa:
+ (BOOL)stringIsNumber:(NSString *)str {
BOOL valid;
double holder;
NSScanner *scan = [NSScanner scannerWithString: str];
valid = [scan scanDouble:&holder] && [scan isAtEnd];
return valid;
}
+ (NSString *)numericStringFromString:(NSString *)string {
NSString *digitsString = string;
if (![YOURCLASSNAME stringIsNumber:string]) {
NSUInteger length = [string length];
if (length > 0) {
digitsString = [string substringToIndex:length - 1];
if (![YOURCLASSNAME stringIsNumber:digitsString]) {
digitsString = [YOURCLASSNAME numericStringFromString:digitsString];
}
}
}
return digitsString;
}
Poi nella mia classe Controller, implemento controlTextDidChange:
- (void)controlTextDidChange:(NSNotification *)obj {
NSString *digitsString = [YOURCLASSNAME numericStringFromString:self.currentCellView.textField.stringValue];
if (digitsString) {
self.currentCellView.textField.stringValue = digitsString;
} else {
self.currentCellView.textField.stringValue = @"";
}
}
Il vantaggio di questo approccio è che se si incolla il testo nel campo di numero, questo rimuoverà tutti i caratteri non numerici dalla fine della stringa finché non rimarrai con un numero. Inoltre supporta una serie arbitrariamente lunga di cifre. Alcuni degli altri approcci non supportano l'inserimento di una serie di cifre che non possono essere contenute in un NSInteger.
So che questo approccio potrebbe certamente essere migliorato.
fonte
2012-03-08 07:26:48
È possibile creare una sottoclasse di NSTextField e monitorarne l'input, come mostrato qui: http://pagesofinterest.net/blog/2010/11/subclassing-nstextfield-to-allow-only-numbers/ –