1.通过输入时触发的代理方法
shouldChangeTextInRange: replacementText:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
首先, 这个方法本身是没有问题的, 当通过键盘进行输入时, 就会触发此代理方法, 通过判断当前文字长度, 决定当前输入的字符是否可以生效. 但是, 这个限制有个遗漏的小问题, 就是当输入文字后, 键盘上面有输入提示字符, 点击提示字符输入时, 此代理方法是不会触发的. 所以就造成了, 可以输入超过20个字的bug.
2.通过输入完成时的代理或者监听通知
若要解决上面的问题就要在输入已经改变完成时, 对其进行修改, 即在代理方法中 textViewDidChange: 或者在监听通知UITextViewTextDidChangeNotification/ UITextFieldTextDidChangeNotification.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
在输入英文时, 不会有任何问题, 但是在输入中文时, 因为有一个英文输入转为中文的时机, 所以会造成如下崩溃.
* Terminating app due to uncaught exception ‘NSRangeException’, reason: ‘NSMutableRLEArray replaceObjectsInRange:withObject:length:: Out of bounds’
3.通过输入完成时的代理或者监听通知
textViewDidChange: 或者UITextViewTextDidChangeNotification/UITextFieldTextDidChangeNotification
添加一个判断, 没有需要转化为中文的英文字符
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
第3个方法为第2个方法的完善, 也是最合适的限制文字长度的方法.
-
顶
- 1