這幾天在做設置暱稱 但是限制漢字輸入爲10個的時候,發現不太好做,原有的方法限制的只是字符串的長度,但是我們再輸入漢字的時候打字拼音的長度也被計算了,有時候輸入拼音太長就會被中斷,,很麻煩
例如 中國龍(zhonguolong) 實際只有三個字 但是拼音太長直接被砍掉
我在網上找到一些解決方法 但實際都不理想 在他們的基礎上有研究了一個上午,勉強可以複合我自己的要求
如下:首先 獲取鍵盤模式
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeMode:)name:@"UITextInputCurrentInputModeDidChangeNotification" object:nil];
-(void) changeMode:(NSNotification *)notification{
NSLog(@"%@",[[UITextInputMode currentInputMode] primaryLanguage]);
}
2011-07-18 14:32:48.565 UIFont[2447:207] zh-Hans //簡體漢字拼音
2011-07-18 14:32:50.784 UIFont[2447:207] en-US //英文
2011-07-18 14:32:51.344 UIFont[2447:207] zh-Hans //簡體手寫
2011-07-18 14:32:51.807 UIFont[2447:207] zh-Hans //簡體筆畫
2011-07-18 14:32:53.271 UIFont[2447:207] zh-Hant //繁體手寫
2011-07-18 14:32:54.062 UIFont[2447:207] zh-Hant //繁體倉頡
2011-07-18 14:32:54.822 UIFont[2447:207] zh-Hant //繁體筆畫
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 鍵盤輸入模式
這兒方法
UITextRange *selectedRange = [textField markedTextRange]; 獲取字符的range
//獲取高亮部分 的position 也就是拼音輸入的那部分
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
// 沒有高亮選擇的字,則對已輸入的文字進行字數統計和限制
還需要了解漢字字符串 的關係 獲取字符串中漢字的個數
UTF8編碼:漢字佔3個字節,英文字符佔1個字節
NSString *toBeString = @"how to go to 中國";
int chNum =0;
for (int i=0; i<toBeString.length; ++i)
{
NSRange range = NSMakeRange(i, 1);
NSString *subString = [toBeString substringWithRange:range];
const char *cString = [subString UTF8String];
if (strlen(cString) == 3)
{
NSLog(@"漢字:%@",subString);
chNum ++;
}
}
Unicode的官方可以查到這些編碼
for
(
int
i=0; i< [str length];i++){
int
a = [str characterAtIndex:i];
if
( a > 0x4e00 && a < 0x9fff)
NSLog
(@
"漢字"
);
得到字符串中的每一個char,char 值大於255的可以看作是漢字
//有了這些準備 就基本解決問題了
在ViewDidload 中註冊 不要忘記在 dealloc 中remove 掉通知
_canedit 爲一個BOOL 用來判斷
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:)
name:@"UITextFieldTextDidChangeNotification"
object:_suqareName];
-(void)textFiledEditChanged:(NSNotification *)obj{
UITextField *textField = (UITextField *)obj.object;
NSString *toBeString = textField.text;
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage]; // 鍵盤輸入模式
if ([lang isEqualToString:@"zh-Hans"]) { // 簡體中文輸入,包括簡體拼音,健體五筆,簡體手寫
UITextRange *selectedRange = [textField markedTextRange];
//獲取高亮部分
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
// 沒有高亮選擇的字,則對已輸入的文字進行字數統計和限制
int chNum =0;
for (int i=0; i<toBeString.length; ++i)
{
NSRange range = NSMakeRange(i, 1);
NSString *subString = [toBeString substringWithRange:range];
const char *cString = [subString UTF8String];
if (strlen(cString) == 3)
{
NSLog(@"漢字:%@",subString);
chNum ++;
}
}
if (chNum>=9) {
_canedit =NO;
}
if (!position) {
if (toBeString.length > 10) {
textField.text = [toBeString substringToIndex:10];
_canedit =YES;
}
}
// 有高亮選擇的字符串,則暫不對文字進行統計和限制
else{
}
}
// 中文輸入法以外的直接對其統計限制即可,不考慮其他語種情況
else{
if (toBeString.length > 20) {
textField.text = [toBeString substringToIndex:20];
_canedit =NO;
}
}
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString * toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string]; //得到輸入框的內容
if (toBeString.length<=10) {
_canedit =YES;
}
if (_canedit==NO) { //如果輸入框內容大於20則彈出警告
return NO;
}
return YES;
}
我的問題基本解決