1. 程式人生 > >iOS開發之textField字元長度限制的方法

iOS開發之textField字元長度限制的方法

在微信公眾號上看到一篇技術文章,是關於UITextField輸入時限制字元長度的方法,突然想到當時練習時剛好也遇到這個問題,因此整理一下。

UITextField的相關代理方法

// 返回值為YES表示允許編輯,返回值NO為表示不允許編輯
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;

// 成為第一響應,即可以進行輸入操作
- (void)textFieldDidBeginEditing:(UITextField *)textField;
  • 上述兩個代理方法之間存在一定聯絡,當textFieldShouldBeginEditing
    返回值為YES時,textFieldDidBeginEditing方法會呼叫;當textFieldShouldBeginEditing返回值為NO時,textFieldDidBeginEditing方法不會呼叫
// 返回值為YES表示編輯狀態結束,並重置第一響應狀態;返回值為NO表示保持編輯狀態 
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField;

// 編輯狀態結束呼叫,在編輯結束狀態返回值為NO的情況下也可能會被呼叫(e.g.檢視在應用視窗中被移除)
- (void)textFieldDidEndEditing:(UITextField
*)
textField;
  • 上述兩個代理方法之間也存在一定聯絡,當textFieldShouldEndEditing返回值為YES時,textFieldDidEndEditing方法呼叫;當textFieldShouldEndEditing返回值為NO時,textFieldDidEndEditing方法一般不會呼叫,當有特殊情況(e.g.檢視從應用視窗中移除)時可能會呼叫
// 返回值為YES表示替換指定字元內容,返回值為NO內容不發生變化
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange
)
range replacementString:(NSString *)string; // 點選輸入框的清除按鈕時呼叫,當返回時為NO時不呼叫 - (BOOL)textFieldShouldClear:(UITextField *)textField; // 點選鍵盤迴車時呼叫,當返回值為NO時不呼叫 - (BOOL)textFieldShouldReturn:(UITextField *)textField;

練習時的方法

練習textField時,只調用了textField的代理方法,在每次輸入字元時判定已輸入字元的長度,這種情況下輸入中文會有問題,即最後幾個字元會以拼音形式存在而不能轉化為中文字元。

代理方法,適應於字母、數字形式,不支援中文,可用於使用者登陸名判斷、密碼判斷和手機號判斷。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([textField isEqual:userNameTextField]) {
        if (range.location > 10) {
            userNameTextField.text = [userNameTextField.text substringToIndex:11];
            return NO;
        }
    }else {
        if (range.location > 5) {
            passPortTextField.text = [passPortTextField.text substringToIndex:6];
            return NO;
        }
    }
    return YES;
}

可判斷中文字數的方法

限制textField輸入內容為24個位元組長度(中文字數是8個)。

  • 新增對UITextField的編輯變化事件的監聽:
[customTextField addTarget:self action:@selector(RestrictTextFieldLength:) forControlEvents:UIControlEventEditingChanged];
  • 實現方法:
- (IBAction)RestrictTextFieldLength:(id)sender {
    UITextField *textField = (UITextField *)sender;
    NSString *temp = textField.text;

    if (textField.markedTextRange == nil) {
        while(1){
            if ([temp lengthOfBytesUsingEncoding:NSUTF8StringEncoding] <= 24) {
                break;
            }else {
                temp = [temp substringToIndex:temp.length-1];
            }
        }
        textField.text = temp;
    }
}

說明:判斷輸入內容位元組數有沒有超出限制位元組數,如果沒有則繼續輸入,如果超出位元組數就去掉最後一個字,再判斷是否超過限制長度,如此迴圈,直到滿足長度限制要求。

注意:直接使用length方法,返回的是字元數,而不是位元組數,lengthOfBytesUsingEncoding返回的是指定字元編碼的位元組數。

另,中文輸入和英文輸入不一樣,中文輸入會出現正在輸入拼音,還未選擇中文,但拼音已經輸入了。此時,拼音本身的位元組長度可能大於待選中文所佔的位元組長度。例如輸入字,拼音zhong佔5個位元組長度,而只佔三個位元組長度。所以考慮到這種情況,比較位元組長度之前需要判斷當時textField是否有已選中的內容。

特殊情況下的中文再處理

在上述拼音輸入過程中,如果未選擇中文而是直接儲存,那麼textFiled會把未轉換為中文的拼音也一起儲存進去。所以,在儲存textField的內容時需要進行處理,把超出的部分去掉。

  • 實現方法:
- (void)RepairTextFieldLength {
    NSString * temp = customTextField.text;
    while(1) {
        if ([temp lengthOfBytesUsingEncoding:NSUTF8StringEncoding] <= 24) {
            break;
        }else {
            temp = [temp substringToIndex:temp.length-1];
        }
    }
    customTextField.text=temp;
}

相關推薦

iOS開發textField字元長度限制方法

在微信公眾號上看到一篇技術文章,是關於UITextField輸入時限制字元長度的方法,突然想到當時練習時剛好也遇到這個問題,因此整理一下。 UITextField的相關代理方法 // 返回值為YES表示允許編輯,返回值NO為表示不允許編輯 - (

iOS 開發 為UIButton新增類別方法載入網路圖片

UIButton+WebCache.h #import <UIKit/UIKit.h> // 為Button新增類別方法 @interface UIButton (WebCache) - (void)xr_setButtonImageWit

iOS開發刪除過期Provisioning Profiles方法

1、在finder下開啟go -> go to folder輸入: ~/Library/MobileDevice/Provisioning Profiles 2、檢視上面的列表,按照時間順序刪

ios開發--NSString中substringFromIndex,substringWithRange,substringToIndex方法的使用

字符 nsrange min nbsp 範圍 clas ring div make 1,substringFromIndex 從索引0開發到到index的後面的字符 2,substringWithRange 取指定range裏面的字符,左邊為索引index,右邊為截取的範圍

iOS開發--巨集定義與const的區別及使用方法

巨集定義的常見用法: 定義一段程式碼,或指定字串抽成巨集。 const(常量): 當有字串常量的時候,蘋果推薦我們使用const,蘋果經常把常用的字串定義成const   巨集定義與const的區別: 編譯時刻:巨集是預編譯(編譯之前處理),const是編譯階段。 編

IOS開發延時執行的幾種方法

1.最直接的方法performSelector:withObject:afterDelay: 這種方法的缺點:每次要為延時寫一個方法 2.使用類別,用BOLCK執行 [程式碼]c#/cpp/oc程式碼: 01 @implementation NSObje

iOS開發常用的加密方法

開發中常用的加密方法: AES加密:加密過後以NSData的形式存下來,如若想以NSString的形式儲存,那對NSData進行Base64編碼 BASE64:使用者名稱密碼進行BASE64加密 M

iOS開發使用block塊進行資料遍歷的方法

看了一篇文章,發現遍歷陣列、字典中的資料時,除了使用for迴圈外,還可以使用block塊進行操作,瞬間感覺iOS的語言程式碼確實有點高大上的感覺,下面就簡單的介紹一下這個方法。首先是最基本的運用形式,//基於 塊(block) 結構的遍歷陣列方法  enumerate:列舉,

iOS開發-收集的不常用卻實用的小方法和技巧

1.顏色轉變成圖片 - (UIImage *)createImageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); UIGraphicsBeginI

iOS開發獲取裝置唯一標識的各種方法?IDFA、IDFV、UDID分別是什麼含義?

一、UDID (Unique Device Identifier) UDID的全稱是Unique Device Identifier,顧名思義,它就是蘋果IOS裝置的唯一識別碼,它由40個字元的字母和數字組成。在很多需要限制一臺裝置一個賬號的應用中經常會用到。

iOS開發swift與OC混編出現的坑,oc中不能對swift的代理進行呼叫,不能訪問swift中的代理,swift中的回撥方法

1. swift與oc混編譯具體怎麼實現,這兒我就不重複講出了,網上有大把的人講解。 2. 在swift與OC混編的編譯環境下, oc類不能訪問swift建立類中的代理? 解決方法如下: 在代理的頭部加上 @objc(代理名字),這樣就在外部就可以訪問了,如下圖。 然

ios 開發 原生+html5混合開發 [[ 方法互調 ]]

一原生應用修改 html 原生應用呼叫 js程式碼還是比較簡單的,就是藉助UIWebView 的代理方法. 首先,載入 index.html - (void)viewDidLoad {     [

iOS開發實時監測textField輸入變化

// 我這裡控制的是輸入使用者名稱和密碼長度控制,通過這個來設定登入按鈕能不能點選 [self.accountText addTarget:self action:@selector(textFieldDidChange:) forControlEvents:

iOS開發限制只輸入數字和字母

首先,根據需求,定義一個巨集: #define NUM @"0123456789"//只輸入數字 #define ALPHA @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"//只輸入字母 #def

iOS開發百度地圖大頭針的自定義解決方法

方法1 - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>

iOS開發:dispatch_async 與 dispatch_get_global_queue 的使用方法

  GCD是iOS的一種底層多執行緒機制,今天總結一下GCD的常用API和概念,希望對大家的學習起到幫助作用。   GCD佇列的概念   在多執行緒開發當中,程式設計師只要將想做的事情定義好,並追加到DispatchQueue(派發佇列)當中就好了。   派發佇列分為兩種,一種是序列佇列(Seri

iOS開發--屬性關鍵字以及set和get方法

數據 重寫 per 針對 生成 string類 對象 創建 @property 一、屬性分為三大類 1、讀寫性控制 a.readOnly只讀,只會生成get方法,不會生成set方法 b.readWrite可讀可寫,會生成set方法,也會生成get方法(默認設置

iOS開發將字典、數組轉為JSON字符串方法

ctf skin class sda bject serializa ret arr array //將字典轉換成json格式字符串,不含\n這些符號 + (NSString *)gs_jsonStringCompactFormatForDictionary:(NSDic

ios開發 -- invalid nib registered for identifier

層級關系 註意 刪除 出現 ide 提示 sta tab 後來 今天在寫代碼的時候,碰到這麼一個問題: invalid nib registered for identifier (重用符) - nib must contain exactly one top level

iOS開發視頻根據url獲取第一幀圖片,獲取任一幀圖片

keyword rac onerror 根據 ati parameter all ger mage + (UIImage*) thumbnailImageForVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time { AV