异常<uitextfield>,崩溃App </uitextfield>

时间:2013-01-21 10:32:44

标签: iphone ios objective-c xcode uitextfield

这就是我得到的

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't do regex matching on object <UITextField: 0x7165730; frame = (121 208; 179 30); text = 'mail@test.com'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7166ca0>; layer = <CALayer: 0x715ed50>>.'
*** First throw call stack:
(0x1c94012 0x10d1e7e 0xbfbb5e 0xb38bae 0xb383dc 0xb37e9a 0x3c04 0x29a9 0x10e5705 0x1c920       0x1c8b8 0xdd671 0xddbcf 0xdcd38 0x4c33f 0x4c552 0x2a3aa 0x1bcf8 0x1befdf9 0x1befad0 0x1c09bf5 0x1c09962 0x1c3abb6 0x1c39f44 0x1c39e1b 0x1bee7e3 0x1bee668 0x1965c 0x1f95 0x1e95)
libc++abi.dylib: terminate called throwing an exception

抱歉,如果太大,但我不明白这个错误,我从.xib Autolayout禁用,因为这使我的应用程序在旧设备中崩溃,而我的应用程序从未在TextField崩溃,是电子邮件的文本域。

提前致谢。

编辑:

我的代码:

NSString *mail = [email.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if ([self validarEmail:mail])
{
   // code
}

-(BOOL) validarEmail:(NSString *) mail // From internet made for objective-c
{
BOOL stricterFilter = YES;
NSString *stricterFilterString = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSString *laxString = @".+@.+\\.[A-Za-z]{2}[A-Za-z]*";
NSString *emailRegex = stricterFilter ? stricterFilterString : laxString;
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:email];
}

如果我评论IF应用程序将会正常,如果没有,将会崩溃。

提前致谢

3 个答案:

答案 0 :(得分:4)

当我假设您打算在UITextField属性上测试它时,您试图在text对象上测试正则表达式。

编辑自OP编辑问题

注意这一行:

return [emailTest evaluateWithObject:email];

您的“电子邮件”对象是您的文本字段,而不是您的字符串。您的字符串称为mail(它作为参数传递给方法。

答案 1 :(得分:1)

您正在尝试将UITextField对象传递给正则表达式,请确保您发送到正则表达式的对象是NSString,否则您将出现此错误。

你应该使用像

这样的东西
NSString *myString = textField.text;

然后将NSString传递给正则表达式。

如果你要使用你的正则表达式函数很多,你应该做一个检查,以确保你传递的变量是一个NSString,以防止将来出现任何异常。

if ([myString isKindOfClass:[NSString class]]) { /* Code */ }

答案 2 :(得分:1)

问题在于这一行:

return [emailTest evaluateWithObject:email];

您需要将其更改为:

return [emailTest evaluateWithObject:email.text];

return [emailTest evaluateWithObject:mail];