UITextField输入框过滤
UIButton* accessory = [UIButton buttonWithType:UIButtonTypeCustom];
[accessory setImage:[UIImage imageNamed:@"icon_hide"] forState:UIControlStateNormal];
[accessory setImage:[UIImage imageNamed:@"icon_show"] forState:UIControlStateSelected];
accessory.width=SX(34);
accessory.height=SY(23);
_accountTxt = [[UITextField alloc]init];
_accountTxt.rightView = accessory;
_accountTxt.delegate = self;
[_accountTxt addTarget:self action:@selector(accountTxtEditingChangedAction:) forControlEvents:UIControlEventEditingChanged];
_accountTxt.keyboardType = UIKeyboardTypeNumberPad;
_accountTxt.clearButtonMode = UITextFieldViewModeWhileEditing;
_accountTxt.rightViewMode = UITextFieldViewModeUnlessEditing;
_accountTxt.placeholder = @"请输入手机号/用户名";
// UITextField 禁止输入空格
- (void)accountTxtEditingChangedAction:(UITextField *)textField {
textField.text = [textField.text stringByReplacingOccurrencesOfString:@" " withString:@""];
}
// UITextField 禁止输入空格
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *tem = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""];
if (![string isEqualToString:tem]) {
[MBProgressHUD showWarnMessage:@"用户名只能为中英文或数字"];
return NO;
}
return YES;
}
// UITextField 限制只能输入数字
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *charactersInString = @"0123456789n";
NSCharacterSet *set = [[NSCharacterSet characterSetWithCharactersInString:charactersInString] invertedSet];
NSString *filteredStr = [[string componentsSeparatedByCharactersInSet:set] componentsJoinedByString:@""];
if (![string isEqualToString:filteredStr]) {
[MBProgressHUD showWarnMessage:@"格式有误,请输入正确的手机号"];
return NO;
}
return [UITextField numberFormatTextField:textField shouldChangeCharactersInRange:range replacementString:string textFieldType:kPhoneNumberTextFieldType];
}
UITextField 输入框限制特殊字符的输入,只允许中英文及数字输入,直接上代码
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// 1. 去空格,英文输入时联想状态包含空格
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
// 2. 当输入符合规则 或者退格键 或者回车键时允许输入
if ([self isInputCharAvailable:string] || [string isEqualToString:@""] || [string isEqualToString:@"\n"]) {
return YES;
} else {
return NO;
}
return YES;
}
/// 输入字符是否合法 (字母、数字、中文的判断(不包括空格))
- (BOOL)isInputCharAvailable:(NSString *)str {
// ➋➌➍➎➏➐➑➒ 中文键盘拼音9键输入
NSString *pattern = @"^[➋➌➍➎➏➐➑➒a-zA-Z\u4E00-\u9FA5\\d]*$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:str];
return isMatch;
}
坑:
中文键盘拼音9键输入,拦截到的字符是➋➌➍➎➏➐➑➒这些玩意
2.英文输入时单词联想时,前面默认多了一个空格,所以多了第一步的处理
3.对于种类繁多的特殊字符,上面的方法依然有一些漏网字符,如🉐🈵🈲🈶🈺🈸🈴,如果想赶尽杀绝,需要单独处理了
UITextField输入框过滤不想的字符串
/// 过滤不想要的特殊字符
/// @param characterString 特殊字符
- (NSString *)filterWithDoNotWantCharacterString:(NSString *)characterString
{
// NSString *characterString = @";¥?![]{}#%^*£€•$><~|/?!@[]{}(#-%*+=)\\|~(<>$%^&*)+";
NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:characterString];
NSArray *tempStringArray = [self componentsSeparatedByCharactersInSet: doNotWant];//拆分字符串
NSString *tempString = [tempStringArray componentsJoinedByString:@""];//数组拼接字符串
// 这里是清理前后两端空格
tempString = [tempString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
tempString = [tempString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet ]];
// [tempString stringByReplacingOccurrencesOfString:@" " withString:@""];//替换全部空格
return tempString;
}
UITextField 解决中文输入拼音时,计算长度问题
- (void)textFieldDidChangeSelection:(UITextField *)textField {
UITextRange *selectedRange = [textField markedTextRange];
NSString * newText = [textField textInRange:selectedRange];
//获取高亮部分
if(newText.length > 0)
{
return;
}
}
Observable.of(searchTitleView.searchBar.rx.text).merge().subscribe(onNext: { [weak self] (text) in
if var text: String = text, text.count > 15 {
text.removeLast()
self?.searchTitleView.searchBar.text = text
}
}).disposed(by: disposeBag)
func textFieldDidChangeSelection(_ textField: UITextField) {
// 预输入拼音时,不需要处理
if let selectedRange = textField.markedTextRange,
let newText = textField.text(in: selectedRange),
newText.count > 0 {
return
}
}
UITextField输入框过滤表情
// 判断是否含有表情符号 yes-有 no-没有
+ (BOOL)stringContainsEmoji:(NSString *)string {
__block BOOL returnValue =NO;
[string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
const unichar hs = [substring characterAtIndex:0];
if (0xd800) {
if (0xd800 <= hs && hs <= 0xdbff) {
if (substring.length > 1) {
const unichar ls = [substring characterAtIndex:1];
const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
returnValue =YES;
}
}
}else if (0x2100 <= hs && hs <= 0x27ff){
returnValue =YES;
}else if (0x2B05 <= hs && hs <= 0x2b07) {
returnValue =YES;
}else if (0x2934 <= hs && hs <= 0x2935) {
returnValue =YES;
}else if (0x3297 <= hs && hs <= 0x3299) {
returnValue =YES;
}else{
if (substring.length > 1) {
const unichar ls = [substring characterAtIndex:1];
if (ls == 0x20e3) {
returnValue =YES;
}
}
}
if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50 || hs == 0xd83e) {
returnValue =YES;
}
}
}];
return returnValue;
}
// 判断第三方键盘中的表情
+ (BOOL)hasEmoji:(NSString*)string {
NSString *pattern = @"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:string];
return isMatch;
}
// 去除表情
+ (NSString *)disableEmoji:(NSString *)text {
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]"options:NSRegularExpressionCaseInsensitive error:nil];
NSString *modifiedString = [regex stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:@""];
return modifiedString;
}
private func setupRAC() {
Observable.of(renameTextView.rx.text).merge().subscribe(onNext: { [weak self] in
guard let `self` = self else { return }
if var string = $0 {
if NSString.stringContainsEmoji(string) || NSString.hasEmoji(string) {
string.removeLast()
self.renameTextView.text = string
MBProgressHUD.showInfoMessage("请勿输入表情")
return;
}
if string.count > 20 {
//通过字符串截取实现限制20字符长度
string.removeLast()
self.renameTextView.text = (string as NSString).substring(to: 20)
}
self.renameCountLabel.text = "\(string.count)/20"
}
}).disposed(by: rx.disposeBag)
}
网友评论