(2014-01-20 22:32:58)
標(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];
}