源碼下載: https://github.com/DMDavid/TextInputLimit
功能模板:
支付寶中在 ‘設(shè)置’ 界面昵稱設(shè)置里拟淮,UITextField 是可以輸入16個中文昵稱箱靴,32個英文字符聪全,包括emoji等其他文字。
編碼
編碼:Unicode中文占字符:2個英文占字符:1個emoji表情占:4個
編碼:UTF-8中文占字符:3個英文占用:1個emoji表情占:4個
思路設(shè)計
- 將textField.text轉(zhuǎn)碼封拧,如果超過限制的編碼芜茵,對編碼進行截取夷都,再轉(zhuǎn)成String像樊,賦值給textField
- 將textField.text轉(zhuǎn)碼尤莺,如果超過限制的編碼,通過substringToIndex:截取到文字length最后一個長度生棍,繼續(xù)進行判斷颤霎,直到符合條件。
實現(xiàn)
1. 方法一:
1-1.jpg
問題:
用Unicode編碼 NSUnicodeStringEncoding 時涂滴,中英文混合時友酱,會出現(xiàn)英文也2個字符,這顯然有問題柔纵。
用UTF-8編碼 NSUTF8StringEncoding 時缔杉,不會出現(xiàn)問題,但中文是3個字符首量,而表情是4個壮吩,所以這個方法不是太滿足條件,
舍棄
2. 方法二:
首先在NSString分類中添加分類方法byteLength加缘,支付寶emoji表情處理是按2個字符的,所以我們采用第一種計算字符方法觉啊。
E5FFCBC5-13BD-4F28-B4F4-5A26CB2D6213.jpg
- 實現(xiàn)TextField代理方法:
textField: shouldChangeCharactersInRange: replacementString:
0EB8DE1A-2684-47EB-9866-34C7A16B72DA.jpg
和通知屬性 :
4BC3EA10-C073-48F9-8148-F000003C2890.jpg
這里說明一下:
1.鍵盤輸入的話會先調(diào)用 代理方法拣宏,然后調(diào)用通知。 (第三方鍵盤輸入調(diào)用順序相同)
2. 如果是系統(tǒng)鍵盤聯(lián)想輸入的話會調(diào)用通知杠人,而代理方法不執(zhí)行勋乾。
所以只需要同時實現(xiàn)這兩個方法宋下,來處理不同輸入的情況。
代碼實現(xiàn):
876E8219-57D4-4086-ACBC-92C7A7BC0B3C.jpg
運行代碼辑莫,一個一個輸入沒問題涧尿,實現(xiàn)了功能侮东。但是,當(dāng)使用第三方鍵盤輸入超過textField限定最大的長度的時候,問題出現(xiàn)了并鸵,textField里面沒有文字。 原因是其监,第三方鍵盤輸入調(diào)用TextField代理方法传藏,在判斷上超過了指定的長度,return NO 屉更, 限制了textField的輸入徙融。
修改bug:
8FF1C597-5C7C-4EA0-B627-3D7CC1207CF8.jpg
再測試下,目前還沒發(fā)現(xiàn)有什么bug瑰谜,和支付寶的處理效果相同欺冀。