#iphone #objective-c #ios
#iPhone #objective-c #iOS
Вопрос:
Мне нужен способ убедиться, что телефонные номера содержат 10 цифр без каких-либо других символов, т.Е. (), и убедитесь, что адреса электронной почты являются действительными электронными письмами (отформатированы правильно).
Есть ли какая-либо библиотека, которая не может облегчить мне это, чтобы мне не приходилось писать регулярные выражения.
Ответ №1:
Это проверит UITextField на наличие правильного адреса электронной почты и номера телефона из 10 цифр или меньше.
Добавьте этот метод в делегат текстовых полей, затем проверьте, следует ли добавлять символы, которые он собирается изменить, или нет.
Возвращает YES
или NO
в зависимости от текстового поля, количества символов в нем в данный момент и того, какие символы он хочет добавить:
#define ALPHA @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
#define NUMERIC @"1234567890"
#define ALPHA_NUMERIC ALPHA NUMERIC
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSCharacterSet *unacceptedInput = nil;
switch (textField.tag) {
// Assuming EMAIL_TextField.tag == 1001
case 1001:
if ([[textField.text componentsSeparatedByString:@"@"] count] > 1)
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:[ALPHA_NUMERIC stringByAppendingString:@".-"]] invertedSet];
else
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:[ALPHA_NUMERIC stringByAppendingString:@".!#$%amp;'* -/=?^_`{|}~@"]] invertedSet];
break;
// Assuming PHONE_textField.tag == 1002
case 1002:
if (textField.text.length string.length > 10) {
return NO;
}
unacceptedInput = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
break;
default:
unacceptedInput = [[NSCharacterSet illegalCharacterSet] invertedSet];
break;
}
return ([[string componentsSeparatedByCharactersInSet:unacceptedInput] count] <= 1);
}
Кроме того, ознакомьтесь с этими 2 статьями:
PhoneNumberFormatter
Автоматически форматирует UITextField телефонного номера на iPhone.
Комментарии:
1. Выглядит хорошо, я раньше не заглядывал в делегат текстового поля.
2. chown, это отлично работает, но, похоже, не обрабатывает события delete key. Возвращает NO, если значение phone> = 10, поэтому не изменяется при удалении
3. О, вы правы. Заменить
if (textField.text.length >= 10)
наif (textField.text.length string.length > 10)
4. Использование тегов (магических чисел) для различения ваших представлений — не очень умный код. Почему бы просто не сравнить «TextField == self.emailInput», предполагая, что у вас есть два свойства self.emailInput и self.phoneInput? Код будет легче читать и менее подвержен ошибкам. Кроме того, в целом регулярные выражения дадут вам лучшие результаты: «[0-9] {10}» для телефонных номеров и что-то вроде «[a-zA-Z] [a-zA-Z.0-9]{2,30}@([ а-за-З][а-zA-Z0-9]{1,30}[.]) [ a-zA-Z]{2,3} для электронных писем. Обратите внимание, что я не проверял регулярное выражение электронной почты, это просто то, что может сработать, и я не помню, как именно это должно выглядеть.
Ответ №2:
Вот простой способ обеспечить длину номера телефона в UIViewController, который имеет текстовое поле в его представлении.
- (void)valueChanged:(id)sender
{
if ([[[self phoneNumberField] text] length] > 10) {
[[self phoneNumberField] setText:[[[self phoneNumberField] text]
substringToIndex:10]];
}
}
- (void) viewWillAppear:(BOOL)animated
{
[[self phoneNumberField] addTarget:self
action:@selector(valueChanged:)
forControlEvents:UIControlEventEditingChanged];
}
Для электронных писем, я полагаю, вы хотите проверить регулярное выражение, когда оно теряет фокус.
Ответ №3:
Вот простой пример проверки UITextField при вводе с клавиатуры, другие символы не отображаются
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
//UITextField *tf_phonenumber,*tf_userid;
if (textField.text<=10) {
char c=*[string UTF8String];
if (tf_phonenumber==textField) //PhoneNumber /Mobile Number
{
if ((c>='0' amp;amp; c<='9')||(c==nil)) {
return YES;
}
else
return NO;
}
if (tf_userid==textField) //UserID validation
{
if ((c>='a' amp;amp; c<='z')||(c>='A' amp;amp; c<='Z')||(c==' ')||(c==nil)) {
return YES;
}
else
return NO;
}
return YES;
}
else{
return NO;
}
}