textFieldShouldEndEditing 委托导致无法ResignFirstResponder 的一个 Bug
2013-12-06 16:21
375 查看
这个Bug 在 SDK 6.1 下存在。首先让我们模拟一下这个 Bug 是如何出现的。
新建一个 Single View Application,命名为 TextFieldResignFirstResponderBug。勾选 useStoryboard 和 use ARC。
在故事板编辑器中,从 Library 中拖一个 UIViewController 到故事板中,
选择这个新的 ViewController,在上面放一个 Button,和一个 TextField,然后 Embed In->Navigation Controller。 修改故事板的 Initial View Controller 为 NaviagtionController。
然后从 Button 上拖一条 push segue 到 ViewController(即 Xcode 模板为我们提供的默认的ViewController)。
这样,当我们点击 UIButton,将 push 到第2个页面(即 Xcode 模板创建的 ViewController 类)。
在第2个 Scene 中,拖入两个 TextField 和2个 UIButton(一个“返回”,一个叫“释放键盘”)。编辑后的故事板布局如下图所示:
打开 Asistant Editor,将上边这个 TextField 连接到 IBOultet 属性 textField,并设置它的delegate 为 ViewController。为第一个按钮“返回”按钮的 TouchUpInside 事件创建一个 IBAction,叫做 close。close:方法中,加入代码:
[self.navigationControllerpopViewControllerAnimated:YES];
这样,当用户点击“返回”,界面会 pop 到第一个 View Controller。
同时为第二个按钮“释放键盘”按钮创建 IBAction 连接,方法代码如下:
- (IBAction)freeKeyboard:(id)sender {
[[UIApplicationsharedApplication] sendAction:@selector(resignFirstResponder) to:nilfrom:nilforEvent:nil];
}
这样,当我们点击“释放按钮”时,无论输入焦点是位于哪个 TextField,键盘都会被释放。
然后在 ViewController.m 中实现 UITextFieldDelegate:
#pragma mark text fielddelegate
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField{
if (_textField.text==nil ||_textField.text.length==0) {
NSLog(@"请输入至少1个字符!");
returnNO;
}
returnYES;
}
在 textFieldShouldEndEditing: 方法中,如果用户在第一个文本字段不进行任何输入,我们将返回 NO,即不允许它resignFirstResponder(释放键盘)。只有当 textField 中起码输入了一个字符,我们才会返回 YES。
运行程序,点击“Button”按钮,push 到第2个 ViewController ,此时焦点自动位于第一个 TextField,如果你不在其中输入点什么,你会发现你无法移动焦点到第2个TextField,同时控制台会输出一个“请输入至少1个字符!”的消息,哪怕你点击“释放键盘”按钮也没有什么作用。
当然,你并不想输入任何字符,你只想快点离开这个该死的地方。当你点击“返回”按钮,界面回到第一个 ViewController……但是你会发现,控制台连续输出了3个“请输入至少1个字符!”消息。
此时如果你想在界面上进行任何输入都已经不可能了!在第1个 ViewController 中,我们曾经放入了一个 TextField 。但你此时点击这个 TextField 将不会有任何结果:键盘不会弹出,焦点不会出现。
这个情况在整个应用程序的所有 ViewController 都是一样的。哪怕你再次进入第2个 ViewController,也无法在任何一个 TextField 中进行输入,除非你关闭程序。
要解决这个问题十分的简单,打开 ViewController.m ,在 close 方法 popViewControllerAnimated 之前插入语句:
_textField.delegate=nil;
新建一个 Single View Application,命名为 TextFieldResignFirstResponderBug。勾选 useStoryboard 和 use ARC。
在故事板编辑器中,从 Library 中拖一个 UIViewController 到故事板中,
选择这个新的 ViewController,在上面放一个 Button,和一个 TextField,然后 Embed In->Navigation Controller。 修改故事板的 Initial View Controller 为 NaviagtionController。
然后从 Button 上拖一条 push segue 到 ViewController(即 Xcode 模板为我们提供的默认的ViewController)。
这样,当我们点击 UIButton,将 push 到第2个页面(即 Xcode 模板创建的 ViewController 类)。
在第2个 Scene 中,拖入两个 TextField 和2个 UIButton(一个“返回”,一个叫“释放键盘”)。编辑后的故事板布局如下图所示:
打开 Asistant Editor,将上边这个 TextField 连接到 IBOultet 属性 textField,并设置它的delegate 为 ViewController。为第一个按钮“返回”按钮的 TouchUpInside 事件创建一个 IBAction,叫做 close。close:方法中,加入代码:
[self.navigationControllerpopViewControllerAnimated:YES];
这样,当用户点击“返回”,界面会 pop 到第一个 View Controller。
同时为第二个按钮“释放键盘”按钮创建 IBAction 连接,方法代码如下:
- (IBAction)freeKeyboard:(id)sender {
[[UIApplicationsharedApplication] sendAction:@selector(resignFirstResponder) to:nilfrom:nilforEvent:nil];
}
这样,当我们点击“释放按钮”时,无论输入焦点是位于哪个 TextField,键盘都会被释放。
然后在 ViewController.m 中实现 UITextFieldDelegate:
#pragma mark text fielddelegate
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField{
if (_textField.text==nil ||_textField.text.length==0) {
NSLog(@"请输入至少1个字符!");
returnNO;
}
returnYES;
}
在 textFieldShouldEndEditing: 方法中,如果用户在第一个文本字段不进行任何输入,我们将返回 NO,即不允许它resignFirstResponder(释放键盘)。只有当 textField 中起码输入了一个字符,我们才会返回 YES。
运行程序,点击“Button”按钮,push 到第2个 ViewController ,此时焦点自动位于第一个 TextField,如果你不在其中输入点什么,你会发现你无法移动焦点到第2个TextField,同时控制台会输出一个“请输入至少1个字符!”的消息,哪怕你点击“释放键盘”按钮也没有什么作用。
当然,你并不想输入任何字符,你只想快点离开这个该死的地方。当你点击“返回”按钮,界面回到第一个 ViewController……但是你会发现,控制台连续输出了3个“请输入至少1个字符!”消息。
此时如果你想在界面上进行任何输入都已经不可能了!在第1个 ViewController 中,我们曾经放入了一个 TextField 。但你此时点击这个 TextField 将不会有任何结果:键盘不会弹出,焦点不会出现。
这个情况在整个应用程序的所有 ViewController 都是一样的。哪怕你再次进入第2个 ViewController,也无法在任何一个 TextField 中进行输入,除非你关闭程序。
要解决这个问题十分的简单,打开 ViewController.m ,在 close 方法 popViewControllerAnimated 之前插入语句:
_textField.delegate=nil;
相关文章推荐
- 在textFieldShouldEndEditing 方法中调用[self.tableView reloadData] 失效问题
- 一个界面里面有多个UITextField时,点击每个UITextField都会进入textFieldShouldBeginEditing delegate方法
- ios 使用 resignFirstResponder 无法hide键盘
- 一个view上的多个textfield键盘resignFirstResponder事件
- UITextField : 如果设置text,然后调用 resignFirstResponder的问题
- textFieldShouldReturn方法键盘无法消失 无法return的问题
- textFieldShouldReturn 键盘无法消失 无法return的问题
- 在Django的Model中定义TextField字段导致无法在Mysql中生成表格
- textFieldShouldReturn 键盘无法消失 无法return的问题
- 在Django的Model中定义TextField字段导致无法在Mysql中生成表格
- [bug修复方案分享]阿拉伯文导致TextView显示顺序左右颠倒
- [导入]用openoffice.org来修复因为excel2000的bug而导致无法打开的excel文档
- 记一次EditText设置默认选中setSelection的一个bug
- 万恶的ie,一个空格导致的ie js无法执行的问题
- Keil BUG 导致读字库时,无法显示某些汉字解决办法
- NOKIA手机无法发短信息的一个小Bug
- AS3中TextField无法改变alpha的解决办法
- Xcode6.0下,UItextfield成为FirstResponder无法呼出键盘的解决
- Visual Studio 2010 STL的一个bug导致内存泄露
- 一个textbrowser设置垂直滚动条样式表的bug