iOS開發之textField字元長度限制的方法
在微信公眾號上看到一篇技術文章,是關於UITextField輸入時限制字元長度的方法,突然想到當時練習時剛好也遇到這個問題,因此整理一下。
UITextField的相關代理方法
// 返回值為YES表示允許編輯,返回值NO為表示不允許編輯
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;
// 成為第一響應,即可以進行輸入操作
- (void)textFieldDidBeginEditing:(UITextField *)textField;
- 上述兩個代理方法之間存在一定聯絡,當
textFieldShouldBeginEditing
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