輸入框過濾操作

定義過濾類型

typedef NS_OPTIONS(NSUInteger, FilterActionType) {

    FilterKeyWordsType = 0x001,

    FilterEmojiType = 0x010,

    FilterLimitType = 0x100,

    FilterNoneType = 0x000

};

擴展UIVIew

@interface UIView (FilterKeyWords)

@property (nonatomic, strong) NSArray *filterKeyWordsArray;

@property (nonatomic, assign) int limitInputWords;

@property (nonatomic, assign) int filterActionType;

@end

執(zhí)行操作


#import <objc/runtime.h>

static const char LimitInputWordsCountAddressKey;

static const char FilterKeyWordsAddressKey;

static const char FilterActionTypeAddressKey;

@implementation UIView (FilterKeyWords)

- (void)setFilterActionType:(int)filterActionType {

    objc_setAssociatedObject(self, &FilterActionTypeAddressKey, [NSString stringWithFormat:@"%d",filterActionType], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
    if(filterActionType == FilterNoneType) {
        return;
    }
    
    [self registerFilterNotification];
}

- (void)registerFilterNotification {

    NSString *textDidChangeNotificationName = ([self isKindOfClass:[UITextField class]] && ![(UITextField *)self isSecureTextEntry]) ?
    
    UITextFieldTextDidChangeNotification : [self isKindOfClass:[UITextView class]] ?
    
    UITextViewTextDidChangeNotification : nil;
    
    if(!textDidChangeNotificationName) {
    
        return;
    
    }
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChangeAction:) name:textDidChangeNotificationName object:nil];

}

- (int)filterActionType {
    return [[self filterActionTypeString] intValue];
}

- (NSString *)filterActionTypeString {
    return objc_getAssociatedObject(self, &FilterActionTypeAddressKey);

}

- (void)setLimitInputWords:(int)limitInputWords {

    if(limitInputWords <= 0) {
        return;
    }
    
    objc_setAssociatedObject(self, &LimitInputWordsCountAddressKey, [NSString stringWithFormat:@"%d",limitInputWords], OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (int)limitInputWords {
    return [objc_getAssociatedObject(self, &LimitInputWordsCountAddressKey) intValue];

}

- (NSArray *)filterKeyWordsArray {
    return objc_getAssociatedObject(self, &FilterKeyWordsAddressKey);

}

- (void)setFilterKeyWordsArray:(NSArray *)filterKeyWordsArray {
    if(filterKeyWordsArray) {
        objc_setAssociatedObject(self, &FilterKeyWordsAddressKey, filterKeyWordsArray, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }

}

- (void)textDidChangeAction:(NSNotification *)notify {

    NSString *selfText = [self valueForKey:@"text"];
    
    NSString *lang = [self.textInputMode primaryLanguage]; // 鍵盤輸入模式
    
    int limitCount = self.limitInputWords;
    
    FilterActionType actionType = [[self filterActionTypeString] intValue];
    
    if ([lang isEqualToString:@"zh-Hans"]) { // 簡體中文輸入,包括簡體拼音,健體五筆失球,簡體手寫
    
        UITextRange *selectedRange = [self valueForKey:@"markedTextRange"];
        
        //獲取高亮部分
        
        UITextPosition *position = nil;
        
        if([self isKindOfClass:[UITextField class]]) {
        
            position = [(UITextField *)self positionFromPosition:selectedRange.start offset:0];
        
        }

        else if ([self isKindOfClass:[UITextView class]]) {
        
            position = [(UITextView *)self positionFromPosition:selectedRange.start offset:0];
        
        }

    // 沒有高亮選擇的字砸王,則對已輸入的文字進行字數(shù)統(tǒng)計和限制
    
        if (!position) {
        
            if (actionType & FilterLimitType && selfText.length > limitCount) {
            
                selfText = [selfText substringToIndex:limitCount];
            
            }
        
            [self setValue:[self textFilterWordsWithText:selfText] forKey:@"text"];
        
        }
        
        // 有高亮選擇的字符串谜喊,則暫不對文字進行統(tǒng)計和限制
        
        else{
            
        }
    
    }
    
    // 中文輸入法以外的直接對其統(tǒng)計限制即可既穆,不考慮其他語種情況
    
    else{
    
        if (actionType & FilterLimitType && selfText.length > limitCount) {
        
            selfText = [selfText substringToIndex:limitCount];
        
        }
    
        [self setValue:[self textFilterWordsWithText:selfText] forKey:@"text"];
    
    }

}
// 過濾掉文字
- (NSString *)textFilterWordsWithText:(NSString *)aText {

    NSString *tempString = aText;
    
    FilterActionType actionType = [[self filterActionTypeString] intValue];
    
    if(actionType == FilterNoneType) {
    
        return aText;
    
    }
    
    if(actionType & FilterKeyWordsType) {
    
        __block NSString *replaceString = tempString;
        
        [self.filterKeyWordsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        
            if([obj isKindOfClass:[NSString class]] && [obj length] > 0) {
        
            replaceString = [replaceString stringByReplacingOccurrencesOfString:obj withString:@""];
        
        }
        
        }];
    
        tempString = replaceString;
    
    }
    
    if(actionType & FilterEmojiType) {
    
        tempString = [tempString stringByReplacingOccurrencesOfString:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [tempString length])];
    
    }
    
    return tempString;

}

@end

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市劫扒,隨后出現(xiàn)的幾起案子捐顷,更是在濱河造成了極大的恐慌荡陷,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迅涮,死亡現(xiàn)場離奇詭異废赞,居然都是意外死亡,警方通過查閱死者的電腦和手機叮姑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門唉地,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事渣蜗⊥雷穑” “怎么了旷祸?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵耕拷,是天一觀的道長。 經(jīng)常有香客問我托享,道長骚烧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任闰围,我火速辦了婚禮赃绊,結果婚禮上,老公的妹妹穿的比我還像新娘羡榴。我一直安慰自己碧查,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布校仑。 她就那樣靜靜地躺著忠售,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迄沫。 梳的紋絲不亂的頭發(fā)上稻扬,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音羊瘩,去河邊找鬼泰佳。 笑死,一個胖子當著我的面吹牛尘吗,可吹牛的內(nèi)容都是我干的逝她。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼睬捶,長吁一口氣:“原來是場噩夢啊……” “哼汽绢!你這毒婦竟也來了?” 一聲冷哼從身側響起侧戴,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤宁昭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酗宋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體积仗,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年蜕猫,在試婚紗的時候發(fā)現(xiàn)自己被綠了寂曹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隆圆,靈堂內(nèi)的尸體忽然破棺而出漱挚,到底是詐尸還是另有隱情,我是刑警寧澤渺氧,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布旨涝,位于F島的核電站,受9級特大地震影響侣背,放射性物質發(fā)生泄漏白华。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一贩耐、第九天 我趴在偏房一處隱蔽的房頂上張望弧腥。 院中可真熱鬧,春花似錦潮太、人聲如沸管搪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽更鲁。三九已至,卻和暖如春寻狂,著一層夾襖步出監(jiān)牢的瞬間岁经,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工蛇券, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缀壤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓纠亚,卻偏偏與公主長得像塘慕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蒂胞,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫图呢、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理骗随,服務發(fā)現(xiàn)蛤织,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 正如 這偶爾的饑餒 水 蒸發(fā)于無形 從肉體中漸漸抽出 你看見自己 遠處 塔照見在泥潭 傘 映出風雨 青黃一片的 你...
    四夕山人閱讀 241評論 0 1
  • 第一章《接單》 “ 我的世界里,顧客不是我們的上帝涨椒,對于我來說摊鸡,我們才是顧客的上帝绽媒。” “好”免猾,收工...
    小壓力閱讀 208評論 0 0
  • 當我看到羅蘭羅曼的“世上只有一種英雄主義猎提,就是在認清生活的真相之后获三,依然熱愛生活”時,我腦海里涌現(xiàn)的第一個人忧侧,便是...
    大牙惠閱讀 13,377評論 51 206