天天看点

限制UIAlertView上的TextField的输入字符长度

一个汉字占两个字符长度

 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"签名" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];

   alertView.alertViewStyle = UIAlertViewStylePlainTextInput;  //设置AertView的样式,带有一个输入框

    alertView.delegate = self;

    [[alertView textFieldAtIndex:0] addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];  //给alertView的textField添加一个事件 因为TextField没有didChange方法

//alertView的textField的响应事件

- (void)textFieldDidChange:(UITextField *)textField

{

    if (textField.markedTextRange == nil) { //输入中文时,当英文转为中文后再调用convertToInt::事件

        textField.text = [self convertToInt:textField.text :64];

    }

}

- (NSString *)convertToInt:(NSString *)text :(int)length

{

    int i, n = [text length], l = 0, a = 0, b = 0;

    int len = 0;

    unichar c;

    for (i = 0; i < n; i++) {

        c = [text characterAtIndex:i];

        if (isblank(c)) { // 判断输入的字符是否为空格或者换行

            b++;

        } else if (isascii(c)) { // 判断输入的字符是否为英文

            a++;

        } else { // 判断输入的字符是否为中文

            l++;

        }

        len = l * 2 + (int)ceilf((float) (a + b)); // ceilf去最接近的较大整数

        if (len > length) {

         [[UIApplication sharedApplication].keyWindow makeToast:[NSString stringWithFormat:@"最多只允许输入%d个英文字符,汉字占两个字符", length] duration:defaultDuration position:@"center"];  

            return [text substringToIndex:i];

        }

    }

    if (a == 0 && l == 0) {

        return text;

    }

    return text;

}