目录
- 前言
- 一、监听UITextField 内容变化
- 二、监听UITextView文本内容高度变化
- 三、cell中的文本框,在reloadData or reloadRow后失去焦点
- 四、手机号码、银行卡号格式化
前言
本文总结了在使用 UITextField & UITextView 时遇到的一些问题及场景,以及对应的解决方案。 目前覆盖的面可能不太全,后面会持续更新…..
一、监听UITextField 内容变化
已知三种方式 :
- 代理:delegate
- 通知:NSNotification
- 目标动作:addTarget:action:
1. 代理
代理方式只能监听设置了代理的文本框。没有设置代理的文本框不能进行监听。
设置代理
self.textField.delegate = self;
实现协议及协议方法 <UITextFieldDelegate>
@interface MyController:UIViewController <UITextFieldDelegate>
@end
@implementation MyController
//是否可以编辑yes可以 no不可以
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
return YES;
}
//开始编辑的时候调用
- (void)textFieldDidBeginEditing:(UITextField *)textField{
NSLog(@"开始编辑");
}
//是否允许结束编辑(当用户结束一个文本框的时候,首先会调用这个)
//如果是NO 意思就是,这个文本框回一直处于编辑状态(也叫第一响应者),就算你再点击其他文本框,是没有任何效果的
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
return YES;
}
//结束编辑的时候调用
- (void)textFieldDidEndEditing:(UITextField *)textField{
NSLog(@"结束编辑");
}
//是否允许用户输入文件
//用户每次输入一个字符的时候就会调用一次。然后判断是否显示在文本框里
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
//打印
NSString *text=[NSString stringWithFormat:@"%@%@",textField.text,string];
NSLog(@"------%@",text);
return YES;
}
//是否允许清除当前文本框中所输入的内容
- (BOOL)textFieldShouldClear:(UITextField *)textField{
return YES;
}
@end
2. 通知
可以监听所有文本框的内容变化
添加通知监听 UITextFieldTextDidChangeNotification
[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textChange:)
name:UITextFieldTextDidChangeNotification object:nil];
-(void)textChange: (NSNotification *)notif {
NSLog(@“-----Change-----");
}
使用完成后,一定要销毁
//当前对像要销毁的时候,创建的通知要进行移除:(否则可能报错,坏内存访问)
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
3. 目标动作事件
多个控件,可以使用同一个消息处理。也可以是多个不同的消息处理。
添加目标动作 events: UIControlEventEditingChanged
[self.textField1 addTarget:self action:@selector(textChange:) forControlEvents:UIControlEventEditingChanged];
[self.textField2 addTarget:self action:@selector(textChange:) forControlEvents:UIControlEventEditingChanged];
内容改变时触发
//我把2个文本框的监听触发方法都设置为textChange: 目的是判断登录按钮是否可以点击
-(void)textChange:(UITextField *)tf {
if(tf == self.textField1){
NSLog(@"第一个文本控件的内容发生变化");
}else if (tf == self.textField2){
NSLog(@"第二个文本控件的内容发生变化");
}
}
二、监听UITextView文本内容高度变化
遇到的需求或问题:
做聊天键盘时,在文字录入区域,如果用单行文本展示,则会出现当文本内容过多时内容展示不全的情况,同时修改与预览文本也比较费劲。 针对这种情况 像微信、QQ等的做法是 : 根据文本内容动态调整文本框控件的高度, 并设置一个最大可显示的高度,超过这个高度不再调整。
有了思路,那么接下来要解决的就是如何知道文本高度发生了变化? 您可能想到的是 :如果当文本改变时,实时计算录入文本的高度与原有高度进行比较, 如果与原高度不同,则触发。这样做的话,只要有字符变化就会调用一次计算,效率不可能会高,所以,这种方式显然不是最优解。
解决方法:
其实,UITextView
控件是继承自UIScrollView
的。 当我们需要知道UIScrollView内容是否变化时,监听的是它的contentSize
属性。 那么对于UITextView
控件同样适用。所以如果想要知道UITextView内容的高度,也可以通过contentSize
来拿到。
CGFloat height = self.textView.contentSize.height;
三、cell中的文本框,在reloadData or reloadRow后失去焦点
遇到的需求或问题:
接上面的场景。 当文本框处于UITableViewCell or UICollectionViewCell中时,会碰到如下情况: 文本框处于获取焦点状态, 监听文本内容高度的变化同步更改Cell的高度。 通常在获取到新的高度后,我们会使用reloadRow
or reloadData
来重新布局与加载数据。 但此时你们发现调用完后,文本框失去了焦点。我们期望的是:在监听到文本内容高度发生变化时,同步更改cell的高度,并且文本框不会失去焦点。 这该怎么解决呢 ?
解决方法:
UICollectionView
和UITableView
都提供了这样一个方法: performBatchUpdates:completion:
// allows multiple insert/delete/reload/move calls to be animated simultaneously. Nestable.
- (void)performBatchUpdates:(void (NS_NOESCAPE ^ _Nullable)(void))updates
completion:(void (^ _Nullable)(BOOL finished))completion;
使用这个方法让UICollectionView
进行重新布局,相当于调用了[collectionView reloadData]
方法,但是UITextField
控件不会失去焦点仍然是第一响应者,从而解决了重新布局导致键盘收起的问题。
使用:
//类似像调用 reloadData一样使用
[self.tableView performBatchUpdates:^{
} completion:^(BOOL finished) {
}];
四、手机号码、银行卡号格式化
查看更多内容: https://blog.csdn.net/zhanglei5415/article/details/132743478
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容