有时候由于后台容量,需要在手机端限制输入字体数量,搜索一下,网上的方法基本上都是这样:
- (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
}
})