UITextField限制字数方法

? ? ? ? 今天被这个问题坑了一天.在UITextField的delegate方法里,各种判断.结果还是有bug.最明显的是中文输入模式下,联想输入可以突破字数限制.

  今天找到一种方法,注册观察者UITextFieldTextDidChangeNotification.如果UITextField内容改变,就计算字数并判断.
分三步走:
   第一步:注册观察者.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:_partNameTextField];

? ? ? ? ?第二步:实现观察者的方法.

?

- (void)textFieldDidChange:(NSNotification *)obj
{
    UITextField * textField = (UITextField *)obj.object;

    NSString *toBeString = textField.text;

    // 键盘输入模式(判断输入模式的方法是iOS7以后用到的,如果想做兼容,另外谷歌)
    NSArray * currentar = [UITextInputMode activeInputModes];
    UITextInputMode * current = [currentar firstObject];

    if ([current.primaryLanguage isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
        UITextRange *selectedRange = [textField markedTextRange];
        //获取高亮部分
        UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
        // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
        if (!position) {
            if (toBeString.length > kTextFieldLengthLimit) {
                textField.text = [toBeString substringToIndex:kTextFieldLengthLimit];
                [self showErrorTips:nil message:NSLocalizedString(@"textField_length_limit", nil)];//此方法是我引入的第三方警告框.读者可以自己完成警告弹窗.
            }
        }
        // 有高亮选择的字符串,则暂不对文字进行统计和限制
        else{

        }
    }
    // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
    else{
        if (toBeString.length > kTextFieldLengthLimit) {
            textField.text = [toBeString substringToIndex:kTextFieldLengthLimit];

        }
    }

}

? ? ? ? 第三步:销毁观察者.

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:_partNameTextField];
}

?

? ? ? ? 好了,打完收工.

?

?

时间: 2024-10-26 17:40:30

UITextField限制字数方法的相关文章

uitextField限制字数方法和抖动效果

这个方法也是在网上找的.具体如下: .h文件 #import <UIKit/UIKit.h> @interface UITextField (LimitLength) /** * 使用时只要调用此方法,加上一个长度(int),就可以实现了字数限制,汉字不可以 * * @param length */ - (void)limitTextLength:(int)length; /** * uitextField 抖动效果 */ - (void)shake; @end .m文件 #import &q

UItextfield 基本属性 代理方法

在使用UItextfield时它的基本属性和代理方法都很简单,但有一次我用UItextfield时出现了这种情况,有三个UI textfield,其中第一个点击触发代理方法,其他两个点击处于编辑状态,当时我试了好多方式都没有成功.后来经过查资料和问同事才得以解决.我遇到过这样的问题相信也有很多同行也会遇到,这里我就把它分享给大家. 在头文件中导入: #import "IQKeyboardManager.h" 然后在写入下面两段代码: //设置本视图不使用IQKeyBoard,键盘不使用

iOS UITextField 输入字数限制的实现

首先你的ViewController需要实现 UITextFieldDelegate 代理, 其次,需要字数限制的UITextField实例的代理要设置成 self(ViewController) 然后实现下列代理方法: Objective—C -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ if

iOS中UITextField的字数限制

刚开始的时候, 采用的是shouldChangeCharactersInRange http://stackoverflow.com/questions/433337/set-the-maximum-character-length-of-a-uitextfield 这样在输入全部是英文的情况下是可以的. 但是当输入是中文时, 由于shouldChangeCharactersInRange判断的是当前键盘的字符数, 会出现这样的问题: 比如你还剩下2个字可以打, 你想输入"张三", &

UITextField的代理方法:textField:shouldChangeCharactersInRange:replacementString

原文链接:http://www.cnblogs.com/zhanggui/p/6101813.html 这个我在开发的过程中用到的次数最多,因此这里就简单对其进行分析.先看看Command+点击 弹出的内容解释: 它的解释大概意思如下:告诉代理方法指定的text应不应该改变.textfiled会在用户输入内容改变的情况下调用.使用这个方法来验证使用时用户输入的类型.例如,你可以使用这个方法来让用户只是输入数字,而没有其他字符. 它的string参数:用来在指定范围替换的字符.在输入的过程中,这个

UITextField的代理方法

- (void)textFieldDidBeginEditing:(UITextField *)textField 当textField开始编辑的时候调用,可用完成如下的需求:点击textField可以使页面往上滑动 必须加上这句代码 [UIView animateWithDuration:.25 animations:^{ _scrollView.contentOffset = CGPointMake(0, 75); }]; - (void)textFieldDidEndEditing:(UI

IOS UITextField 使用与方法解读

UITextField是IOS开发中用户交互中重要的一个控件,常被用来做账号密码框,输入信息框等. 初始化一个文字框: UITextField * textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 30, 100, 100)]; 设置和获取文字框文字: @property(nonatomic,copy)  NSString *text; 通过AttributedString创建和获取文字: @property(nonato

iOS 限制UITextfield的字数

之前在cocoachina看到一篇文章http://www.cocoachina.com/ios/20160106/14889.html,挺实用的,非常好用,肯定以后可以遇到,登录的时候肯定能遇到 - (void)textFieldTextDidChanged:(UITextField *)sender {     NSString * tempString = sender.text;          if (sender.markedTextRange == nil && tempS

UITextField的协议方法

//将要开始输入时调用-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{    return YES;}//将要输入结束时调用-(BOOL)textFieldShouldEndEditing:(UITextField *)textField{    return YES;}//点击清除文字按钮时调用的事件-(BOOL)textFieldShouldClear:(UITextField *)textField{    retur