iOS string處理中文的坑

需求: 要一個只能輸入中文的textfiled

難點: 中文是由拼音拼出來的末捣,拼音是英文字母

解決: 創(chuàng)建了一個Help 來負(fù)責(zé)處理和替換字符串

代碼: 代碼如下

.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
// 篩選管理類
@interface ChineseNotificationHelp : NSObject
+ (instancetype)ChineseNotificationHelpShareWithTextFiled:(UITextField *)textFiled;
@end
.m
#import "ChineseNotificationHelp.h"
@interface ChineseNotificationHelp ()
@property (nonatomic,strong)UITextField *textFiled;
@end
@implementation ChineseNotificationHelp
+ (instancetype)ChineseNotificationHelpShareWithTextFiled:(UITextField *)textFiled{
    static ChineseNotificationHelp *share = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        share = [[ChineseNotificationHelp alloc] init];
    });
    share.textFiled = textFiled;
    return share;
}
- (instancetype)init{
    self = [super init];
    if (self) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFiledEditChanged)
                                                   name:@"UITextFieldTextDidChangeNotification"
                                                 object:nil];
    }
    return self;
}
- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UITextFieldTextDidChangeNotification" object:nil];
}
-(void)textFiledEditChanged{
    [self textFiledTextChange:self.textFiled];
}
- (void)textFiledTextChange:(UITextField *)textField{
    NSString *string = textField.text;
    NSArray *currentar = [UITextInputMode activeInputModes];// 鍵盤輸入模式
    UITextInputMode *current = [currentar firstObject];
    NSString *lang = current.primaryLanguage;
    if(![lang isEqualToString:@"zh-Hans"]) return;
    UITextRange *selectedRange = [textField markedTextRange];
    //獲取高亮部分
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
    if(position) return;// 有高亮則不處理
    // 過濾非漢字
    NSMutableString *chinese = string.mutableCopy;
    for (int i = 0; i<string.length; i++) {
        int a = [string characterAtIndex:i];
        if (a > 0x4e00 && a < 0x9fff) continue;
        [chinese replaceCharactersInRange:NSMakeRange(i,1) withString:@" "];
    }
    // 除去所有空格
    textField.text = [self removeSpaceAndNewline:chinese];
}
// 刪除kon
- (NSString *)removeSpaceAndNewline:(NSString *)str
{
    NSString *temp = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
    temp = [temp stringByReplacingOccurrencesOfString:@"\r" withString:@""];
    temp = [temp stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    return temp;
}
@end

使用

// 只需要一句話就解決了  [ChineseNotificationHelp ChineseNotificationHelpShareWithTextFiled:chineseText];
    chineseText = [[UITextField alloc]initWithFrame:CGRectMake(10, 100, [UIScreen mainScreen].bounds.size.width-20, 50)];
    chineseText.backgroundColor = [UIColor lightGrayColor];
    chineseText.placeholder =@"只能輸入漢字";
    [self.view addSubview:chineseText];
    [ChineseNotificationHelp ChineseNotificationHelpShareWithTextFiled:chineseText];
附加篇幅

問題:在上文的前提下英文九宮格輸入法下俗或,連點任意一個字符導(dǎo)致出現(xiàn)刪除情況
解決:

if(self.beforeString && self.beforeString.length > textField.text.length && [chinese containsString:@" "]){
        //英文切換過程中處理出現(xiàn)刪減的bug
        textField.text = self.beforeString;
        return;
    }

更正:(.m如下)

#import "ChineseNotificationHelp.h"
@interface ChineseNotificationHelp ()
@property (nonatomic,strong)UITextField *textFiled;
@property (nonatomic,strong)NSString *beforeString;
@end
@implementation ChineseNotificationHelp
+ (instancetype)ChineseNotificationHelpShareWithTextFiled:(UITextField *)textFiled{
    static ChineseNotificationHelp *share = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        share = [[ChineseNotificationHelp alloc] init];
    });
    share.textFiled = textFiled;
    return share;
}
- (instancetype)init{
    self = [super init];
    if (self) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFiledEditChanged)
                                                   name:@"UITextFieldTextDidChangeNotification"
                                                 object:nil];
    }
    return self;
}
- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UITextFieldTextDidChangeNotification" object:nil];
}
-(void)textFiledEditChanged{
    [self textFiledTextChange:self.textFiled];
}
- (void)textFiledTextChange:(UITextField *)textField{
    NSString *string = textField.text;
    NSLog(@"1.=%@",textField.text);
    NSArray *currentar = [UITextInputMode activeInputModes];// 鍵盤輸入模式
    UITextInputMode *current = [currentar firstObject];
    NSString *lang = current.primaryLanguage;
    if(![lang isEqualToString:@"zh-Hans"]) return;
    UITextRange *selectedRange = [textField markedTextRange];
    //獲取高亮部分
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
    if(position) return;// 有高亮則不處理
    // 過濾非漢字
    NSMutableString *chinese = string.mutableCopy;
    for (int i = 0; i<string.length; i++) {
        int a = [string characterAtIndex:i];
        if (a > 0x4e00 && a < 0x9fff) continue;
        [chinese replaceCharactersInRange:NSMakeRange(i,1) withString:@" "];
    }
    // 除去所有空格
    textField.text = [self removeSpaceAndNewline:chinese];
    NSLog(@"2.=%@",textField.text);
    if(self.beforeString && self.beforeString.length > textField.text.length && [chinese containsString:@" "]){
        //英文切換過程中處理出現(xiàn)刪減的bug
        textField.text = self.beforeString;
        return;
    }
    self.beforeString = textField.text;
}
// 刪除kon
- (NSString *)removeSpaceAndNewline:(NSString *)str
{
    NSString *temp = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
    temp = [temp stringByReplacingOccurrencesOfString:@"\r" withString:@""];
    temp = [temp stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    return temp;
}
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吗冤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子久免,更是在濱河造成了極大的恐慌宙拉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孝情,死亡現(xiàn)場離奇詭異,居然都是意外死亡茉继,警方通過查閱死者的電腦和手機(jī)咧叭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烁竭,“玉大人,你說我怎么就攤上這事吉挣∨伤海” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵睬魂,是天一觀的道長终吼。 經(jīng)常有香客問我,道長氯哮,這世上最難降的妖魔是什么际跪? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上姆打,老公的妹妹穿的比我還像新娘良姆。我一直安慰自己,他們只是感情好幔戏,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布玛追。 她就那樣靜靜地躺著,像睡著了一般闲延。 火紅的嫁衣襯著肌膚如雪痊剖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天垒玲,我揣著相機(jī)與錄音陆馁,去河邊找鬼。 笑死合愈,一個胖子當(dāng)著我的面吹牛氮惯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播想暗,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妇汗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了说莫?” 一聲冷哼從身側(cè)響起杨箭,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎储狭,沒想到半個月后互婿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡辽狈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年慈参,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刮萌。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡驮配,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出着茸,到底是詐尸還是另有隱情壮锻,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布涮阔,位于F島的核電站猜绣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏敬特。R本人自食惡果不足惜掰邢,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一牺陶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辣之,春花似錦掰伸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奏夫,卻和暖如春怕篷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酗昼。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工廊谓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麻削。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓蒸痹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呛哟。 傳聞我的和親對象是個殘疾皇子叠荠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,098評論 25 707
  • github上關(guān)于iOS的各種開源項目集合(轉(zhuǎn)) UI 下拉刷新 EGOTableViewPullRefresh-...
    其實也沒有閱讀 7,163評論 1 111
  • 大家都說長沙失戀了,而且每一年無一例外的都發(fā)生在三月扫责,三月的雨天里榛鼎,我經(jīng)常在等雨停。 等雨停的時候鳖孤,我在想是不是可...
    我的我閱讀 349評論 0 1
  • 丁酉三月一日者娱,日明景媚,余覽于舟城苏揣,因其大形似扁舟之故而得名黄鳍。山環(huán)水繞,其北為北寺塔平匈,東臨仙人澗框沟,西達(dá)文昌塔...
    苗蕾閱讀 839評論 2 4
  • 本文內(nèi)容: ①為什么要給生活按下暫停鍵 ②學(xué)會享受生活 ③找到讓自己幸福的事情 為什么要給生活按下暫停鍵? 因為現(xiàn)...
    7515b237f6ce閱讀 1,092評論 0 1