1. 程式人生 > >iOS6下UITextField退格變清空問題的解決方法

iOS6下UITextField退格變清空問題的解決方法

自己的專案中一直有一個必現的UITextField退格變清空問題,測試發現只有iOS6下有,其它iOS版本都沒有問題,基本上可以確定與iOS6有關。由於問題不是很大又忙就擱置了很久,今天實在不能忍受便花了點時間解決此問題,記錄一下吧。

這個問題是在某個有預設值的UITextField上是必現的,一旦用退格鍵刪除最後一個字元或中間某個字元,整個UITextfield的內容被清空了,一直百思不得其解,google了一下發現有人遇到類似的問題,並給出了復現步驟(連結),如下:

有一個secureTextEntry為Yes的UITextField和 一個普通的UITextField,重現步驟: 
1. 點選普通的UITextField輸入類容, 
2. 點選密碼UITextField輸入內容, 
3. 點選普通的UITextField重新獲得焦點, 
4. 接著點選鍵盤上的退格鍵, 
結果:這時會發現普通的UITextField被清空了。

測試了一下,隨便找一個有使用者名稱與密碼登入頁面的應用,在iOS6下就會復現出這個問題,比如iPhone自帶的郵件app。但這個重現步驟說得並不準確,第1步和第2步的前提是對應的UITextField已經有內容,雖然跟自己的復現方法有點不一樣,不過總算知道這個問題是怎麼回事了。怎麼說呢,這應該是iOS6的UITextField的一個新特性引入的問題,原文把這個問題稱之為“iOS 6 Secure密碼UITextField造成非密碼UITextField退格清空Bug”,但是iOS6.0就有這個問題,iOS6.1.3都沒有解決,估計apple沒把它當bug,坑爹啊。

咱們拿apple沒辦法,那就只有想辦法繞過去啊,初步的思路是截獲退格鍵刪除行為,每點一次退格鍵刪除時只允許刪除一個字元。這就要用到UITextFieldDelegate的一個textField:shouldChangeCharactersInRange:replacementString方法,這個方法是在UITextField的內容改變時呼叫,第二個引數表明內容改變的範圍,第三個引數是替代的字串。程式碼如下:

Here’s Code
1
2
3
4
5
6
7
8
9
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (range.location > 0 && range.length == 1 && string.length == 0)
    {
        textField.text = [textField.text substringToIndex:
textField.text.length - 1];
return NO; } return YES; }

設定一下UITextField的delegate就可以呼叫到此方法,range.length == 1 && string.length == 0就是刪除一個字元時所滿足的條件,如果條件滿足,就只讓textField的內容減少一個字元。初步測試,可以解決退格變清空的問題,但是又帶來另一個問題:如果是在文字中間點退格鍵刪除文字,就變成從文字的最後刪除一個字元。這並不是我們想要的,怎麼辦呢,那就要找到刪除的字元的位置,這個連結裡給了一個終極解決辦法,程式碼如下:

Here’s Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        if (range.location > 0 && range.length == 1 && string.length == 0)
        {
            // Stores cursor position
            UITextPosition *beginning = textField.beginningOfDocument;
            UITextPosition *start = [textField positionFromPosition:beginning offset:range.location];
            NSInteger cursorOffset = [textField offsetFromPosition:beginning toPosition:start] + string.length;
            // Save the current text, in case iOS deletes the whole text
            NSString *text = textField.text;
            // Trigger deletion
            [textField deleteBackward];
            // iOS deleted the entire string
            if (textField.text.length != text.length - 1)
            {
                textField.text = [text stringByReplacingCharactersInRange:range withString:string];
                // Update cursor position
                UITextPosition *newCursorPosition = [textField positionFromPosition:textField.beginningOfDocument offset:cursorOffset];
                UITextRange *newSelectedRange = [textField textRangeFromPosition:newCursorPosition toPosition:newCursorPosition];
                [textField setSelectedTextRange:newSelectedRange];
            }
            return NO;
        }
        return YES;
    }

思路是先取到游標位置,把文字內容暫存,清空原來UITextField的內容,然後將暫存的文字內容中游標左側的文字replace掉重新賦給UITextField,並恢復游標位置,難點在於怎麼獲取游標位置與恢復游標位置。

一般用到使用者名稱與密碼UITextField的地方用這個方法就能解決問題了,只是還有點小問題,即如果不是從中間刪除一個字元,而是一次刪除若干個字元還是有問題的,這是由if中的range.length == 1條件限制的,稍加改造下應該就能解決。另外一個問題是如果有中文字元或其它UTF8字元,估計得考慮一下是不是應該要用“text.length – 1”,不過能有多少應用的使用者名稱或密碼帶中文呢

相關推薦

iOS6UITextField退問題的解決方法

自己的專案中一直有一個必現的UITextField退格變清空問題,測試發現只有iOS6下有,其它iOS版本都沒有問題,基本上可以確定與iOS6有關。由於問題不是很大又忙就擱置了很久,今天實在不能忍受便花了點時間解決此問題,記錄一下吧。 這個問題是在某個有預設值的UITe

( 轉)Ubuntu創建、重命名、刪除文件及文件夾,強制回收站方法

移動文件 trash -c creat 更強 file mmd 文件 spa Ubuntu下創建、重命名、刪除文件及文件夾,強制清空回收站方法 mkdir 目錄名 ——創建一個目錄 rmdir 空目錄名

解決linux退鍵出現 ^? 的問題

容易 inux 所有 linux strong 打印 常用 tro code 處理辦法:使用stty命令修改。 stty命令語法 stty是linux下改變和打印終端設置的常用命令。 stty(選項)(參數) -a:以容易閱讀的方式打印當前的所有配置; -g:以stt

linux資料夾的建立、複製、剪、重新命名、、刪除命令和查詢

在home目錄下有wwwroot目錄,wwwroot下有sinozzz目錄,即/home/wwwroot/sinozzz 一、目錄建立 在/home/wwwroot目錄下新建一個sinozzz123的資料夾 mkdir /home/wwwroot/sinozzz123 二、目錄複製

Canvas 在高繪製圖片模糊的解決方法

問題: 用canvas繪製圖片的時候會模糊,但是用img顯示的時候就不會,canvas和img的大小是相同的  至於為什麼會變模糊,這和瀏覽器處理 canvas 的方式有關,相關的文章可以參考這篇 High DPI Canvas,這裡不作深入介紹。 下面是相關的程式碼:

關於 Windows 10 原生輸入法輸入字母和數字時字間距突然大的解決方法

在編輯一篇文章的時候不知按了什麼鍵,字母和數字字間距突然變大,如下: Hello world! 作為參考,正常間距如下: Hello world! 從搜尋引擎查過,發現是全形和半形的問題。但是由於我使用的 Windows 10 原生輸入法,按照很多人的解

Oracle SqlPlus 中的方向鍵和退鍵失效的解決辦法

在剛裝好的Oracle中,我們使用SqlPlus會發現非常的蹩腳,不僅退格鍵不好用,方向鍵也不行調出history,下面有幾種解決方法。 1.可以使用ctrl+Backspace鍵強制輸出輸入的錯誤,也可以export stty erase ^h,當然這只是臨時的方法,想一勞永逸請看下面。 2.在oracl

Python遍歷列表的方法enumerate,以及list方法

遍歷list方法: 方法一: tmplist = [1234, 5677, 8899] for id in tmplist:     print tmplist 輸出:  1234  5677  8899 方法二:用函式enumerate: enumerate()是py

UITableViewCell高亮(按)時,子檢視背景色透明的解決方法

UITableViewCell highlighted subviews backgroundColor自定義的UITableViewCell,在上面新增一個UIView(這裡是UILabel),設定UILabel背景色。但是當cell處於按下狀態時,UILabel背景色就會

IIS設置_session被方法

為什麽 net com 生效 lan img .config pro 兩種 經常聽到程序員會說,明明設置了很長的超時時間,為什麽沒有生效呢?session很快就被清空了。 asp.net默認的sessionstate模式是inproc(進程內),數據是在網站的應用程序池裏面

CentOS重新啟動網路配置,檔案/etc/resolv.conf會被錯誤覆蓋或解決

錯誤: centos從5.6就有這個問題,CentOS重新啟動網路配置,檔案/etc/resolv.conf會被錯誤覆蓋或清空。原因: 在檔案[/etc/sysconfig/network-scrip

queue:queue方法?

C++中的queue自身是不支援clear操作的,但是雙端佇列deque是支援clear操作的。 方法一 直接用空的佇列物件賦值 queue<int> q1; // process

解決Ubuntu 18.04重啟後DNS被方法

res 網絡相關 img add 配置dns 默認值 gateway 獲取 resolved 問題: Ubuntu 18.04重啟後,在/etc/resolv.conf配置的DNS信息和網絡相關信息會丟失 原因: Ubuntu 18.04采用的是netplan來

ubuntu/boot空間被占滿的解決方法

image strong 釋放 方法 網上 目錄 init election dpkg 我這個方法是直接刪除或移除的方法,網上有采用 查看dpkg --get-selections|grep linux 安裝的內核包 然後卸載不需要的內核 sudo apt-get remo

拉列表被flash覆蓋的解決方法

blog har 一個 install ogl flash asp mode .aspx 做鼎聞有一段時間了,有的banner輪播圖的地方用flash替換的時候,就會導致上面的導航條下拉列表被flash覆蓋,找了一段時間沒有得到有效的解決方法,後來知道關鍵是flash的這一

MACsecureCRT無法保存密碼的解決方法

鏈接服務器 crt 密碼錯誤 log 保存密碼 服務 jpg 錯誤 只需要 在mac下新安裝了secureCRT,取代系統自帶的終端工具,主要是為了方便鏈接服務器。mac下面的secureCRT默認保存不上密碼, 我們選擇了保存密碼後,下次登錄還是提示密碼錯誤,需要重新認證

[轉]Linuxis not in the sudoers file解決方法

出現 aud 名稱 vim file brief order mage ima 來源: http://jingyan.baidu.com/article/2a1383284bb3e8074a134f2d.html 當我們使用sudo命令切換用戶的時候可能會遇到提示以

Macmongodb connect failed 連接錯誤解決方法

ase soc base ble 到來 log 運行命令 restrict tro 這幾天一直在折騰mongodb數據庫,一直出現如下這個問題 MongoDB shell version v3.6.0 connecting to: mongodb://127.0.0.1:

Microsoft Offices 2010/2016版Excel使用鼠標滾輪時縮放解決方法

office使用小技巧故障現象: 在EXCEL中使用鼠標滾輪時是縮放無法向上或下移動單元格。解決方法:打開EXCEL,選擇文件,-->選項,-->高級,找到用智能鼠標縮放,把前面的勾取消掉,自此操作完成。Microsoft Offices 2010/2016版Excel使用鼠標滾輪時變縮放解決方法

Ubuntu vi 上下左右ABCD問題解決方法

linux ins abc .aspx 開始 mon vim 執行命令 mov ---恢復內容開始--- 錯誤問題:vi上下左右鍵顯示為ABCD的問題 解決方法: 只要依次執行以下兩個命令即可完美解決Ubuntu下vi編輯器方向鍵變字母的問題。   一.執行命令 sud