Вот мое решение, использующее алгебру множеств с помощью метода isSupersetOfSet:
Это также не позволяет вставлять текст с недопустимыми символами:
- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (string.length == 0 || [_numericCharSet isSupersetOfSet:[NSCharacterSet characterSetWithCharactersInString:string]]) {
return YES;
}
else {
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Invalid Input"
message:@"Only numeric input allowed."
delegate:self
cancelButtonTitle:@"Close"
otherButtonTitles:nil];
[av show];
return NO;
}
}
Примечание: согласно Apple Developer Library , предпочтительнее кешировать статический NSCharacterSet
, чем создавать его снова и снова (здесь _numericCharSet
).
Однако я предпочитаю позволить пользователю вводить любой символ и проверять значение в методе textFieldShouldEndEditing:
, вызываемом, когда textField пытается уйти в отставку первым респондентом.
Таким образом, пользователь может вставить любой текст (возможно, составленный из сочетания букв и цифр) и привести его в текстовые поля. Пользователи не любят, когда их действия ограничены.