UITextField的代理方法:textField:shouldChangeCharactersInRange:replacementString

原文链接:http://www.cnblogs.com/zhanggui/p/6101813.html

这个我在开发的过程中用到的次数最多,因此这里就简单对其进行分析。先看看Command+点击 弹出的内容解释:

它的解释大概意思如下:告诉代理方法指定的text应不应该改变。textfiled会在用户输入内容改变的情况下调用。使用这个方法来验证使用时用户输入的类型。例如,你可以使用这个方法来让用户只是输入数字,而没有其他字符。

它的string参数:用来在指定范围替换的字符。在输入的过程中,这个参数只包含单个输入的字符,比如要输入一句我是程序员,可以看一下结果:

2016-11-25 14:51:42.602606 OnlyNumberTextField[2385:416738] string:---Range's location:0,Range's length:0
2016-11-25 14:51:42.799856 OnlyNumberTextField[2385:416738] string:---Range's location:1,Range's length:0
2016-11-25 14:51:43.373470 OnlyNumberTextField[2385:416738] string:我---Range's location:0,Range's length:2
2016-11-25 14:51:45.202028 OnlyNumberTextField[2385:416738] string:---Range's location:1,Range's length:0
2016-11-25 14:51:45.603080 OnlyNumberTextField[2385:416738] string:---Range's location:2,Range's length:0
2016-11-25 14:51:45.800381 OnlyNumberTextField[2385:416738] string:---Range's location:3,Range's length:0
2016-11-25 14:51:46.357566 OnlyNumberTextField[2385:416738] string:是---Range's location:1,Range's length:3
2016-11-25 14:51:47.067459 OnlyNumberTextField[2385:416738] string:---Range's location:2,Range's length:0
2016-11-25 14:51:47.701954 OnlyNumberTextField[2385:416738] string:---Range's location:3,Range's length:0
2016-11-25 14:51:47.865956 OnlyNumberTextField[2385:416738] string:---Range's location:4,Range's length:0
2016-11-25 14:51:48.068942 OnlyNumberTextField[2385:416738] string:---Range's location:5,Range's length:0
2016-11-25 14:51:48.148413 OnlyNumberTextField[2385:416738] string:---Range's location:6,Range's length:0
2016-11-25 14:51:59.334791 OnlyNumberTextField[2385:416738] string:程---Range's location:2,Range's length:5
2016-11-25 14:52:00.459496 OnlyNumberTextField[2385:416738] string:序---Range's location:3,Range's length:0
2016-11-25 14:52:01.760261 OnlyNumberTextField[2385:416738] string:员---Range's location:4,Range's length:0

看到这个结果凌乱了,还有黑圈数字啥的。那个是占位还没有输入内容的时候的字母提示。然后输入的打印结果就是上面的内容。如果是粘贴,这个string还可能包含更多的字符。当用户删除一个或者多个字符的时候:

2016-11-25 14:54:16.152642 OnlyNumberTextField[2385:416738] string:---Range's location:4,Range's length:1
2016-11-25 14:54:16.602975 OnlyNumberTextField[2385:416738] string:---Range's location:3,Range's length:1
2016-11-25 14:54:17.049679 OnlyNumberTextField[2385:416738] string:---Range's location:2,Range's length:1
2016-11-25 14:54:17.466124 OnlyNumberTextField[2385:416738] string:---Range's location:1,Range's length:1
2016-11-25 14:54:18.436184 OnlyNumberTextField[2385:416738] string:---Range's location:0,Range's length:1

这个string就是空的。

这里的返回值BOOL:YES表示指定的text范围应该被替换成string,否则还是保持原样。

下面举两个例子说明:

第一个:用来验证只能输入数字:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSCharacterSet *charSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
    NSString *filteredStr = [[string componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@""];
    if ([string isEqualToString:filteredStr]) {
        return YES;
    }
    return NO;
}

这里用到了NSCharacterSet类,还有一个array的方法componentsJoinedByString:。该方法的作用是将数组内容进行组合,然后生成一个字符串比如:

NSArray *pathArray = [NSArray arrayWithObjects:@"here", @"be", @"dragons", nil];
NSLog(@"%@",[pathArray componentsJoinedByString:@""]);

输出结果就是:herebedragons

如果ByString后面是@" ",结果就会是:here be dragons。这里还有一个NSString的方法:

- (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator

该方法的而作用是通过set来进行分割字符串,返回分割后的数组。例如:

 NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"0123456"];
    NSString *nam = @"1g2h45j3d688";
    NSLog(@"%@",[nam componentsSeparatedByCharactersInSet:set]);

结果如下:

2016-11-25 15:25:56.615351 OnlyNumberTextField[2403:421474] (
    "",
    g,
    h,
    "",
    j,
    d,
    88
)

如果上面的set 调用 invertedSet输出结果如下:

2016-11-25 15:27:29.218759 OnlyNumberTextField[2405:421836] (
    1,
    2,
    45,
    3,
    6,
    "",
    ""
)

因此以下的代码:

 NSCharacterSet *set = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
    NSString *nam = @"1g2h45j3d688";
    NSArray *arr = [nam componentsSeparatedByCharactersInSet:set];
    NSLog(@"%@",[arr componentsJoinedByString:@""]);

输出结果就是:12453688

因此就拿只能输入数字这个方法而言,方法里面先设置了一个反转的set,然后将将要替换的字符进行过滤,如果过滤后还是和原来一样,说明满足过滤标准,就替换原有字符。如果不符合原有标准就在直接返回NO,也就意味着不替换原有字符,保持原样。

此外,还有只能输入字母和数字的判断方法:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSCharacterSet *charSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"] invertedSet];
    NSString *filteredStr = [[string componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@""];
    if ([string isEqualToString:filteredStr]) {
        return YES;
    }
    return NO;
}

和只输入数字的方法差不多,只是过滤条件有所差异。

 

 比如你还想只输入字母,你可以直接修改set为:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

 

结束。

时间: 2024-11-10 00:16:09

UITextField的代理方法:textField:shouldChangeCharactersInRange:replacementString的相关文章

IOS UITextField 使用与方法解读

UITextField是IOS开发中用户交互中重要的一个控件,常被用来做账号密码框,输入信息框等. 初始化一个文字框: ? 1 UITextField * textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 30, 100, 100)]; 设置和获取文字框文字: @property(nonatomic,copy)  NSString *text;  通过AttributedString创建和获取文字: @property(n

iOS UITableView代理方法详解

IOS UITableView的代理方法详解 一.补充 在上一篇博客中,http://my.oschina.net/u/2340880/blog/404605,我将IOS中tableView(表视图)的一些常用方法总结了一下,这篇将tableView的代理方法作了总结,对上一篇博客进行了补充. 二.UITableViewDataSourc(数据源代理) 1.必须实现的回调方法 返回每个分区的行数 - (NSInteger)tableView:(UITableView *)tableView nu

WKWebView代理方法解析

一.前言 上一篇文章已经对WKWebView做了一个简单的介绍,主要对它的一些方法和属性做了一个简单的介绍,今天看一下WKWebView的两个协议:WKNavigationDelegate 和 WKUIDelegate. 二.WKNavigationDelegate 根据字面意思,它的作用是用于导航(navigation)的代理.其实里面定义了n多个方法,用于处理网页接受.加载和导航请求等自定义的行为.直接拿下面的例子来看: #pragma mark - WKWebView Navigation

子类继承父类实现父类的代理方法

子类继承父类实现父类的代理方法 父类提供虚函数(OC中称为代理方法),子类继承后实现虚函数来实现特定的功能. 父类方法: NumberCount.h 与 NumberCount.m // // NumberCount.h // YXMWeather // // Created by XianMingYou on 15/2/18. // Copyright (c) 2015年 XianMingYou. All rights reserved. // #import <Foundation/Foun

ios-iOS中点击tableview的cell没有调用代理方法didSelectRow

问题描述 iOS中点击tableview的cell没有调用代理方法didSelectRow 我在控制器中创建一个tableview也给这个控制器设置了代理和数据源可是点击cell没有调用- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; 解决方案 这个方法是UITableView的代理方法,你可以将tableView的delegate设置为控制器,然后在cotro

ios-关于IOS协议代理方法自动调用问题?

问题描述 关于IOS协议代理方法自动调用问题? 各位大牛好, 想问一个关于IOS协议代理的问题: 是否通过遵守某个协议,实现了其中的方法,对于这些方法来说,大多数情况下是 视图对象对其进行自动调用的吗? 例如:当表格不知道自己的行高,就去找实现了相关方法的代理?找它实现的相关方法 来自动获得行高? 小弟不太理解代理与协议方面的知识,希望可以有大牛解答,谢谢. 解决方案 你理解的不错,的确是这样,但是少了一步.除了遵守协议,实现方法之外,还要把自身设置成被委托对象.....delegate =se

ios-iOS 9在使用定位服务获取经纬度的时候,系统不调用代理方法,怎么解决?

问题描述 iOS 9在使用定位服务获取经纬度的时候,系统不调用代理方法,怎么解决? @interface NearbyViewController (){ // CLLocationManager *_locationManager; CLGeocoder *_lgeocoder; } @property (strong, nonatomic) CLLocationManager *locationManager; @end (void)viewDidLoad { [super viewDidL

iOS流布局UICollectionView系列二——UICollectionView的代理方法

iOS流布局UICollectionView系列二--UICollectionView的代理方法 一.引言         在上一篇博客中,介绍了最基本的UICollectionView的使用和其中我们常用的属性和方法,也介绍了瀑布流布局的过程与思路,这篇博客是上一篇的补充,来讨论关于UICollectionView的代理方法的使用.博客地址: UICollectionView的简介和简单使用:http://my.oschina.net/u/2340880/blog/522613 二.UICol

JQuery之proxy实现绑定代理方法_jquery

在javascript中,this指代的对象时常会变化,这会造成程序,混乱,一般做法就是先将this保存在一个变量中,就不怕她变了,我们先看一个小例子 var A = function(){ this.star = functiont(){}; this.beg = function(){ var that = this; $node.click(function(){ //this.start();//这里的this指代的是$node对象 that.start(); }); }; } JQue