UITextField中文輸入法輸入時(shí)對(duì)字符長(zhǎng)度的限制

(2014-01-20 22:32:58)

轉(zhuǎn)載

標(biāo)簽:

it分類:技術(shù)iOS

如題的問題夷陋,又是個(gè)讓我抓狂了大半天的問題欠拾,還是做個(gè)記錄,有與類似問題的同學(xué)可參考骗绕,但不一定對(duì)藐窄。具體問題還需具體分析。我遇到的需求是這樣的:有一個(gè)輸入框酬土,輸入框內(nèi)輸入文字荆忍,文字字?jǐn)?shù)限制在20字。

我采用了UITextField作為我的輸入框控件,并且在委托方法:

-(BOOL)textField:(UITextField*)textFieldshouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString*)string

中實(shí)現(xiàn)了對(duì)字符串的長(zhǎng)度限制刹枉,實(shí)現(xiàn)如下:

#define kMaxLength 20

-(BOOL)textField:(UITextField*)textFieldshouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString*)string{

NSString*toBeString=[textField.textstringByReplacingCharactersInRange:rangewithString:string];

if(toBeString.length>kMaxLength&&range.length!=1){

textField.text=[toBeStringsubstringToIndex:kMaxLength];

returnNO;

}

returnYES;

}

這樣實(shí)現(xiàn)的結(jié)果是:對(duì)于純字符的統(tǒng)計(jì)沒有什么問題叽唱,當(dāng)輸入的字符超過限制時(shí)輸入框便截取最大限制長(zhǎng)度的字符串。但是微宝,有個(gè)問題棺亭,當(dāng)使用拼音輸入法時(shí),該委托方法中的最后一個(gè)參數(shù)string接受的是輸入的字母蟋软,而不是選擇的漢字镶摘,造成的結(jié)果是,當(dāng)想輸入文字“我在編程”岳守,輸入拼音“wozaibiancheng”凄敢,每輸入一個(gè)字母便會(huì)進(jìn)入委托方法,統(tǒng)計(jì)的字符長(zhǎng)度是字母的長(zhǎng)度湿痢,實(shí)際上漢字還未超過限制長(zhǎng)度涝缝,但是字母的長(zhǎng)度超過了導(dǎo)致無法繼續(xù)輸入。

而且譬重,致命的是拒逮,這個(gè)委托方法并不響應(yīng),選中候選漢字的過程害幅,這就沒有辦法重新修正字符長(zhǎng)度的統(tǒng)計(jì)了消恍。

網(wǎng)上查了一些方法,有個(gè)叫Onyx的博主寫了篇文章:iOS中UITextView/UITextField 輸入英文和拼音狀態(tài)下如何正確的統(tǒng)計(jì)輸入的文字字?jǐn)?shù)看起來似乎是和我同樣的問題以现,但是當(dāng)我把他的代碼搬到我的類里時(shí)狠怨,實(shí)現(xiàn)的結(jié)果并不理想,我沒有得到想要的結(jié)果邑遏,而且他的方法看起來似乎復(fù)雜了點(diǎn)佣赖,我也沒有研究清楚這個(gè)方法的問題出在哪。之所以把他的這篇博文引進(jìn)來记盒,是因?yàn)樗奈恼潞髞斫o了我些啟發(fā)憎蛤。

我剛開始時(shí)候并沒有發(fā)現(xiàn)

-(BOOL)textField:(UITextField*)textFieldshouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString*)string

這個(gè)委托方法沒有響應(yīng)最后拼音到漢字的過程,當(dāng)我發(fā)現(xiàn)這個(gè)問題時(shí)纪吮,問題便也差不多得到了解決俩檬。因?yàn)樵谥跋蛭⒉┥系囊粋€(gè)朋友咨詢時(shí),他告訴我可以注冊(cè)這個(gè)觀察者UITextInputCurrentInputModeDidChangeNotification

在它的監(jiān)聽下可以得到中文碾盟。我剛開始時(shí)候理解錯(cuò)了他的意思棚辽,以為得到的就是最終選中的漢字,而中間輸入的拼音并不會(huì)被得到冰肴。但其實(shí)這個(gè)監(jiān)聽屈藐,比以上的委托方法多了最后一步而已榔组,即從拼音到中文的過程。

所以實(shí)現(xiàn)的代碼如下联逻。

<1>在init時(shí)候注冊(cè)notification:

[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(textFiledEditChanged:)

name:@"UITextFieldTextDidChangeNotification"

object:myTextField];

<2>實(shí)現(xiàn)監(jiān)聽方法:

-(void)textFiledEditChanged:(NSNotification*)obj{

UITextField*textField=(UITextField*)obj.object;

NSString*toBeString=textField.text;

NSString*lang=[[UITextInputModecurrentInputMode]primaryLanguage];// 鍵盤輸入模式

if([langisEqualToString:@"zh-Hans"]){// 簡(jiǎn)體中文輸入搓扯,包括簡(jiǎn)體拼音,健體五筆包归,簡(jiǎn)體手寫

UITextRange*selectedRange=[textFieldmarkedTextRange];

//獲取高亮部分

UITextPosition*position=[textFieldpositionFromPosition:selectedRange.startoffset:0];

// 沒有高亮選擇的字锨推,則對(duì)已輸入的文字進(jìn)行字?jǐn)?shù)統(tǒng)計(jì)和限制

if(!position){

if(toBeString.length>kMaxLength){

textField.text=[toBeStringsubstringToIndex:kMaxLength];

}

}

// 有高亮選擇的字符串,則暫不對(duì)文字進(jìn)行統(tǒng)計(jì)和限制

else{

}

}

// 中文輸入法以外的直接對(duì)其統(tǒng)計(jì)限制即可箫踩,不考慮其他語種情況

else{

if(toBeString.length>kMaxLength){

textField.text=[toBeStringsubstringToIndex:kMaxLength];

}

}

}

<3>在dealloc里注銷掉監(jiān)聽方法爱态,切記谭贪!

-(void)dealloc{

[[NSNotificationCenterdefaultCenter]removeObserver:self

name:@"UITextFieldTextDidChangeNotification"

object:_albumNameTextField];

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末境钟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俭识,更是在濱河造成了極大的恐慌慨削,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件套媚,死亡現(xiàn)場(chǎng)離奇詭異缚态,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)堤瘤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門玫芦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人本辐,你說我怎么就攤上這事桥帆。” “怎么了慎皱?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵老虫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我茫多,道長(zhǎng)祈匙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任天揖,我火速辦了婚禮夺欲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘今膊。我一直安慰自己些阅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布万细。 她就那樣靜靜地躺著扑眉,像睡著了一般纸泄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腰素,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天聘裁,我揣著相機(jī)與錄音,去河邊找鬼弓千。 笑死衡便,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洋访。 我是一名探鬼主播镣陕,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼姻政,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼呆抑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汁展,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤食绿,失蹤者是張志新(化名)和其女友劉穎器紧,沒想到半個(gè)月后铲汪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帽揪,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年辅斟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了转晰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡士飒,死狀恐怖查邢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酵幕,我是刑警寧澤扰藕,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站芳撒,受9級(jí)特大地震影響邓深,放射性物質(zhì)發(fā)生泄漏未桥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一芥备、第九天 我趴在偏房一處隱蔽的房頂上張望冬耿。 院中可真熱鬧,春花似錦萌壳、人聲如沸亦镶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缤骨。三九已至,卻和暖如春尺借,著一層夾襖步出監(jiān)牢的瞬間绊起,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工褐望, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勒庄,地道東北人串前。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓瘫里,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親荡碾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谨读,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容