iOS 11中UITextField有了一个新功能,就是用户可以将一个UITextField中的文字拖拽到其他的文本框中,当时在做浏览器,自己写了一UITextField当搜索框,然后有个需求就是:在键盘弹的时候,将UITextField内容变成当前网址,而在键盘收起的时候将UITextField内容变为网站标题接下去是原来代码:
@weakify(self);
//利用RAC监听键盘,当键盘收起的时候先将UITextField改为需要的内容
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillHideNotification object:nil] subscribeNext:^(NSNotification * notification) {
@strongify(self);
self.searchTextField.text = @"找不到网页";
}];
然后当你利用UITextField的新特性drag的时候,键盘就会收起来,当你把文字重新drag回UITextField的时候,程序就会闪退,而且没有断点断在崩溃的代码,无法直接定位。
当时百度了很多,有说iOS 11 UITextField内存泄露的之类的,试了下发现都不行,然后一行一行逻辑去检查,注释代码然后进行drag功能,发现就是drag的时候收起键盘的同时,drag和收起键盘的通知同时操作了UITextField,写入了self.searchTextField.text。
发现了问题之后,只好将键盘收起时候的一些逻辑放入了下面代理中。意思就是拖拽的时候收起键盘,然后做一些逻辑处理。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
代码如下
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
[self.view endEditing:YES];
self.searchTextField.text = @"找不到网页";
}
这种奇葩闪退,没有断点可以调试,只能一段一段逻辑去排查,网上也没有资料可以参考,因此记录一下。