这个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;