Вот альтернативная реализация:
+ (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;
}
Затем в моем классе контроллера я реализую 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 = @"";
}
}
Преимущество этого подхода состоит в том, что если вы вставляете текст в свой номерполе, это удалит все нечисловые символы от конца строки, пока у вас не останется только число.Плюс он поддерживает сколь угодно длинный ряд цифр.Некоторые из других подходов не поддерживают ввод ряда цифр, которые не могут быть сохранены в NSInteger.
Я знаю, что этот подход, безусловно, можно улучшить.