UITextField知识点总结(二)

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;

}
“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值