textFieldShouldEndEditing 委托导致无法ResignFirstResponder 的一个 Bug

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值