如何限制UITextView上文字的長度

2021-06-18 20:36:06 字數 3687 閱讀 2443

這個問題基本有兩種解決思路,一是在輸入完畢或即將返回時判斷文字的長度是否超過限制,  這種方法實現起來簡單,只需在委託方法

-(bool)textviewshouldendediting:(uitextview *)textview  中加以判斷即可,但是這種方式體驗不好。

另外一種就是通過  

-(bool)textview:(uitextview *)textview shouldchangetextinrange:(nsrange)range replacementtext:(nsstring *)text  及

-(void)textviewdidchange:(uitextview *)textview  

兩個委託方法來在輸入過程中進行空間,這種方法實現起來比較複雜,特別是對於中文拼音輸入時字元跟字元間夾雜著空格的情況,處理起來比較頭疼,稍不注意就會引起crash。

下面講述第二種思路的實現:

1. 首先,新增乙個鍵盤監聽的類keyboardhandler,監聽鍵盤出現和隱藏以及高度改變的事件,並且向uitextview所在的viewcontroller發出通知,或採用kvo的方式監聽鍵盤高

度。// call this method sometwhere in your view controller setup code.

- (void)registerforkeyboardnotifications

- (void)removeforkeyboardnotifications

- (void)keyboardchange:(nsnotification *)anotification

return;

}_offset = self.accessoroffset == 0 ? -keyboardsizebegin.height : -self.accessoroffset;

[self

updateaccessoranimate:_animating];

self.keyboardheight = keyboardsizeend.height;

_show = yes;

} else

if([anotification.nameisequaltostring:uikeyboardwillhidenotification])

_offset = self.accessoroffset == 0 ? keyboardsizeend.height : self.accessoroffset ;

[self

updateaccessoranimate:_animating];

self.keyboardheight = keyboardsizeend.height;

_show = no;

}else }

2. 在uitextview所在的viewcontroller 增加兩個屬性

@property(nonatomic,assign) bool   istypingchinesecharacter;  //

是否正在輸入中文

@property(nonatomic,strong) nsstring*  textafterchange;  //

上一次改變時文字框內的文字

初始化keyboardhandler 並監聽鍵盤高度的變化,主要是為了對中文輸入進行處理

self

.keyboardhandler= [

qlkeyboardhandler

keyboardnotification]; [

self

.keyboardhandlerregisterforkeyboardnotifications]; [

self

.keyboardhandleraddobserver:

self

forkeypath:

qlkeyname_keyboard_height

options:nskeyvalueobservingoptionnewcontext:

nil];

-(void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary *)change context:(void *)context

else

if (newheight == kchinesekeyboardheight)}}

3. 實現uitextview的委託方法

//在輸入字元後,即將改變textview前

-(bool)textview:(uitextview *)textview shouldchangetextinrange:(nsrange)range replacementtext:(nsstring *)text

//英文輸入過程中,如果文字超出長度限制,後面的直接不讓輸,但對於中文必須讓使用者繼續輸完拼音,選詞的時候再截斷

nsinteger  charactersafterchange = textview.text.length + text.length - range.length;

if (!_istypingchinesecharacter && charactersafterchange > maxtextlength)

return shouldchange;

}//在輸入了字元(不限中英文)或者選定了中文詞語後

-(void)textviewdidchange:(uitextview *)textview

//如果是英文輸入下,直接截斷超出長度限制的文字

if(textcount>maxtextlength&& !_istypingchinesecharacter)

//如果是中文輸入,情況要複雜一點,不能在選詞階段直接截斷文字,否則會crash,必須等詞選好,即將出現在文字框內的時候再階段(也就是第二次呼叫textviewdidchange的時候)

else

if (textcount>maxtextlength && _istypingchinesecharacter && didselectword)

_textafterchange= textview.text;

nslog(

@"textcount = %d"

,_textafterchange.length);

_textcountlabel.text= [

nsstring

stringwithformat:

@"%d字"

,maxtextlength- _textafterchange.length]; }

這裡有個問題,就是當連續輸入中文的拼音首字母時,比如輸入ttss 之類的文字, 文字的長度並不是輸入乙個字元就增加乙個長度,而是1個字元可能對應1個或2個長度。 在textviewdidchange中列印textview.text,可以看到,text的長度是先增加後減少的,這主要是因為蘋果為了區分 不同中文字 而在字元之間加了空格。但是這樣就給程式造成了麻煩, 沒辦法通過textview的文字長度來判斷是否該截斷。 因為如果在拼音沒有輸完的情況下截斷正在輸入的文字會造成程式 crash。經過反覆探索實踐,我發現在中文輸入拼音的時候,如果點了拼音對應的詞語,textview會向他的委託呼叫兩次textviewdidchange, 並把詞語寫到 textview後面,如果發現 兩次呼叫的文字內容不一樣,就會丟擲異常 。 那麼,找到問題之後,就可以對症下藥了,只要 增加乙個變數,記錄上一次文字改變時的內容, 確保在 第二次截斷文字,第一次不截斷, 就不會報錯了。

限制UITextView字數

限制uitextview的輸入字數有好幾種辦法,通常是 bool textview uitextview textview shouldchangetextinrange nsrange range replacementtext nsstring text else 也可以設定當字數達到一定之後,...

UITextView實現限制100字

placehoderlable uilabel alloc initwithframe cgrectmake 3,3,devicewidth 6,40 根據情況調節位置 placehoderlable.enabled no placehoderlable.text 請在這裡輸入您要的內容,您的預言需...

限制UITextView輸入字數(相容iOS7)

限制uitextview輸入字數,但是在ios7上總是崩潰,最後查閱資料找到一下解決方法 numlabel 是輸入框後面的顯示字數標籤,用來顯示當前輸入的字數 kmaxlength 是可輸入的最大文字數 void textviewdidchange uitextview textview else ...