1.点击屏幕将键盘弹回
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
if (![touch.view isKindOfClass: [UITextField class]] || ![touch.view isKindOfClass: [UITextView class]]) {
[self.view endEditing:YES];
}
}
2.输入有限个数的文字
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if (textField == _userField) {
NSMutableString *nutString = [NSMutableString stringWithFormat:@"%@" ,_userField.text];
//获取的输入后的字符
[nutString insertString:string atIndex:range.location];
//判断现在字符的长度,如果>10,不让输入
if (nutString.length > 10) {
return NO;
}
}
return YES;
}
但是这样做也会出现问题,就是你在输入到10个字的时候,键盘上会有联想字,点击联想字可以直接输入到UITextField中这显然不行的 所以解决办法来了 就是在加上以下这个方法 如下:
- (void)textFieldDidChange:(UITextField *)textField
{
if (textField.text.length > 10) {
textField.text = [textField.text substringToIndex:10];
}
}
后来发现这样也还是有问题的,假如输入字数是10个的话,如果我输入到第八个字或者第九个字,然后我下一个字,假如说是广州的广,那么他的拼音是guang,我们只能输入gu
最后网上搜索了下,问题解决了,给UITextField加了个类扩展,其.h代码如下:
#import <UIKit/UIKit.h>
@interface UITextField (ZRLengthLimit)
/**
* 限制输入长度
*
* @param limitMax 限制的长度
* @param target action所在的Target(比如***ViewController;不实现action的话,传nil即可)
* @param action 超出限制长度触发事件(不需要实现action的话,传nil即可)
*/
- (void)addLengthLimit:(int)limitMax tipStr:(NSString *)tipStr target:(id)target action:(SEL)action;
@end
.m代码如下:
#import "UITextField+ZRLengthLimit.h"
#import "MBProgressHUD+Add.h"
#import <objc/runtime.h>
static char *targetKey;
static char *actionKey;
static char *limitKey;
static char *tipsKey;
@implementation UITextField (ZRLengthLimit)
- (void)addLengthLimit:(int)limitMax tipStr:(NSString *)tipStr target:(id)target action:(SEL)action
{
NSString *limitStr = [NSString stringWithFormat:@"%d",limitMax];
objc_setAssociatedObject(self, &limitKey, limitStr, OBJC_ASSOCIATION_RETAIN);
objc_setAssociatedObject(self, &tipsKey, tipStr, OBJC_ASSOCIATION_RETAIN);
objc_setAssociatedObject(self, &targetKey, target, OBJC_ASSOCIATION_ASSIGN);
objc_setAssociatedObject(self, &actionKey, NSStringFromSelector(action), OBJC_ASSOCIATION_RETAIN);
[self addTarget:self action:@selector(UITextFieldTextDidChangeByLimit) forControlEvents:UIControlEventEditingChanged];
}
- (void)UITextFieldTextDidChangeByLimit
{
NSString *limitStr = objc_getAssociatedObject(self, &limitKey);
NSInteger maxLength = [limitStr integerValue];
NSString *tipStr = objc_getAssociatedObject(self, &tipsKey);
id target = objc_getAssociatedObject(self, &targetKey);
NSString *actionStr = objc_getAssociatedObject(self, &actionKey);
SEL runAction = NSSelectorFromString(actionStr);
NSString *toBeString = self.text;
NSString *lang = [[self textInputMode] primaryLanguage]; // 键盘输入模式
if ([lang isEqualToString:@"zh-Hans"] || //简体中文输入法,包括拼音,五笔,手写
[lang isEqualToString:@"zh-Hant"]) //繁体中文输入法
{
//获取高亮部分
UITextRange *selectedRange = [self markedTextRange];
UITextPosition *position = [self positionFromPosition:selectedRange.start offset:0];
if (!position) //没有高亮选择的文本,则对已输入的文本进行字数统计和限制
{
if (toBeString.length > maxLength)
{
//找到当前输入光标位置, 删除超出内容
UITextPosition *beginning = self.beginningOfDocument;
UITextRange *selectedRange = self.selectedTextRange;
UITextPosition *selectionStart = selectedRange.start;
NSInteger location = [self offsetFromPosition:beginning toPosition:selectionStart];
self.text = [self.text stringByReplacingCharactersInRange:NSMakeRange(location-(toBeString.length-maxLength), toBeString.length-maxLength) withString:@""];
if (target && [target respondsToSelector:runAction])
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[target performSelector:runAction ];
#pragma clang diagnostic pop
}
[self showToastWithtipStr:tipStr];
}
}
else //有高亮选择的文本,则暂不对文本进行统计和限制
{
}
}
else //中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
{
if (toBeString.length > maxLength)
{
//找到当前输入光标位置, 删除超出内容
UITextPosition *beginning = self.beginningOfDocument;
UITextRange *selectedRange = self.selectedTextRange;
UITextPosition *selectionStart = selectedRange.start;
NSInteger location = [self offsetFromPosition:beginning toPosition:selectionStart];
self.text = [self.text stringByReplacingCharactersInRange:NSMakeRange(location-(toBeString.length-maxLength), toBeString.length-maxLength) withString:@""];
if (target && [target respondsToSelector:runAction])
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[target performSelector:runAction ];
#pragma clang diagnostic pop
}
}
}
}
-(void)showToastWithtipStr:(NSString *)tipStr{
MBProgressHUD *toastHUD = [[MBProgressHUD alloc] initWithView:[UIApplication sharedApplication].keyWindow];
toastHUD.mode = MBProgressHUDModeText;
toastHUD.removeFromSuperViewOnHide = NO;
toastHUD.yOffset = -40;
[[UIApplication sharedApplication].keyWindow addSubview:toastHUD];
toastHUD.detailsLabelText = tipStr;
[toastHUD show:YES];
[toastHUD hide:YES afterDelay:1.5];
toastHUD.alpha = 0.9f;
}
@end
然后在有textField的控制器里,调用代码:
[textField addLengthLimit:10 tipStr:@"最多输入10个字" target:nil action:nil];
好了,完美解决。。。
3.当账号是邮箱时,进行验证
//利用正则表达式验证
//邮箱的正则表达式
//正则表达式:专门用来匹配某种字符串的模板
-(BOOL)isValidateEmail:(NSString *)email
{
//正则匹配的表达式
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
//使用OC谓词类进行匹配语境
//注意:@"SELF MATCHES这些东西是死的
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
//返回匹配后的结果(BOOL)值 YES:代表匹配成功 NO:匹配失败
return [emailTest evaluateWithObject:email];
}
//4.登录,注册按钮跟随键盘的弹出上移,回收下移,通过通知来实现
//获取通知中心的单例对象
```
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
“`
//第一个参数:触发的方法对应的对象
//第二个参数:当接到通知之后触发的方法
//第三个参数:监听的通知的名字
//第四个参数:发布通知的对象(一般为空)
```
//UIKeyboardWillShowNotification 键盘将要弹出
//UIKeyboardWillHideNotification 键盘将要隐藏
[center addObserver:self selector:@selector(show) name:UIKeyboardWillShowNotification object:nil];
[center addObserver:self selector:@selector(hidden) name:UIKeyboardWillHideNotification object:nil];
//键盘弹出时的方法
-(void)show{
[UIView beginAnimations:nil context:nil];//动画开始
[UIView setAnimationDuration:0.2];//动画持续的时间
[UIView setAnimationRepeatCount:0];//动画是否循环
_loginButton.center = CGPointMake(160, 260);
[UIView commitAnimations];//提交动画
}
//键盘将要隐藏时的方法
-(void)hidden{
[UIView beginAnimations:nil context:nil];//动画开始
[UIView setAnimationDuration:0.2];//动画持续的时间
[UIView setAnimationRepeatCount:0];//动画是否循环
_loginButton.center = CGPointMake(160, 360);
[UIView commitAnimations];//提交动画
}
如果想在textField中的文字改变时,有别的要触发的事件,可以利用监听来实现
//增加监听事件
[_textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
//实现监听
- (void) textFieldDidChange:(id) sender {
UITextField _field = (UITextField )sender;
NSLog(@”%@”,[_field text]);
写入想要触发的事件
}
}
例如:想实时获取textField中的字数,即可用本方法:
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
-(void)textFieldDidChange :(UITextField *)theTextField{
NSInteger existedLength = textField.text.length;
}
“`