ios限制输入字数

有时候由于后台容量,需要在手机端限制输入字体数量,搜索一下,网上的方法基本上都是这样:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
BOOL res = YES;
if (textView.text.length >= 100 && text.length > 0)
{ 
res = NO;
}

return res;
}

我用的是swift,不过和上面的代码大同小异,后来测试报了一个bug,说复制时会超出字数限制,我做了一下修改:

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
        if(text == "\n"){
            textView.resignFirstResponder()
 return true
        }
        if(range.location + count(text) - 1 >= getMax()){
 return false
        }else{
 return true
        }
    }

后来还是被提bug,无奈借了一部机子来重现,原来ios输入法上面有一条提示输入的东西,点击就输入,但是上面的方法没被调用到。
琢磨了一下,我扩展了textViewDidChange的方法:

func textViewDidChange(textView: UITextView) {
     let remain = getMax() - exitNum
     if(remain >= 0){}
     else{
        let str = (self.text as NSString).substringToIndex(getMax())
        textView.text = (str as String)
     }
}

好吧,这里有个坑,在有些输入法下回crash
_NSLayoutTreeLineFragmentRectForGlyphAtIndex invalid glyph index 100

结果发现是textView.text = (str as String)这个要在主线程修改,dispatch回去就没问题了

2016.04.27更新:
要禁用表情,后台是gbk,表情放不下。。。
extension NSString{

func disable_emoji() -> NSString{
    var regex:NSRegularExpression?
    do {
        regex = try NSRegularExpression(pattern: "[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]", options: NSRegularExpressionOptions.CaseInsensitive)
    } catch {

    }
    if(regex != nil){

        let modifiedstr = regex!.stringByReplacingMatchesInString(self as String, options: NSMatchingOptions(), range: NSMakeRange(0, lengths()), withTemplate: "");
        return modifiedstr;
    }
    return self;
}}

后来在被提一个BUG,用系统输入法,输入一次后就不能输入中文了

    let shouldResetText = ((self.text as NSString) != textStr)

    dispatch_async(dispatch_get_main_queue(), {() -> Void in
        if(shouldResetText){
            self.text = textStr as String
        }
        if(remain >= 0){
            self.residue?.text = remain.description + "/" + self.getMax().description
        }
    })

你可能感兴趣的:(ios)