这几天在做设置昵称 但是限制汉字输入为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
{
NSRange range = NSMakeRange(i, 1);
NSString *subString = [toBeString substringWithRange:range];
const char *cString = [subString UTF8String];
if (strlen(cString) == 3)
{
NSLog(@"汉字:%@",subString);
chNum ++;
}
}
for
(
int
i=0; i< [str length];i++){
int
a = [str characterAtIndex:i];
if
( a > 0x4e00 && a < 0x9fff)
NSLog
(@
"汉字"
);
//有了这些准备 就基本解决问题了
在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
{
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;
}
我的问题基本解决