`
dawuafang
  • 浏览: 1111460 次
文章分类
社区版块
存档分类
最新评论

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;

分享到:
评论

相关推荐

    UITextfieldresignFirstResponder键盘不回收

    UITextfield resignFirstResponder键盘不回收

    01-加法计算器

    简单的加法计算器。 //计算 - (IBAction) caculate { // 取出文本框的内容 NSString * num1Text = self....// 只要是自己或自己的子控件呼叫出来的键盘,都可以通过这个方法来退出键盘 [self.view endEditing:YES]; }

    ios开发记录

    //CGAffineTransformMakeRotation 方法的作用就是传进去一个角度(计量单位不是度,是弧度),方法内部帮你生成一个这个角度所对应的旋转矩阵 //rotate 旋转 CGAffineTransform a = ...

    详解IOS点击空白处隐藏键盘的几种方法介绍

    1、[view endEditing:YES] 这个方法可以让整个view取消第一响应者,从而让所有控件的键盘隐藏。 2、[textFiled resignFirstResponder] 这个则是比较常用的让某个textFiled的键盘隐藏。 接下来就是几种实现

    苹果ios开发一年的工作笔记

    [textField resignFirstResponder]; } CGRect CGRect frame = CGRectMake (origin.x, origin.y, size.width, size.height);矩形 NSStringFromCGRect(someCG) 把CGRect结构转变为格式化字符串; CGRectFromString...

    ios 自定义类数字键盘

    iOS自定义数字键盘 使用简单 适配iPhone6/6PLUS self.keyBoardTF.inputView = [[WSNumberKeyBoard alloc] initWithControlTextField:self.keyBoardTF ReturnButtonName:... [textField resignFirstResponder]; }];

    XCode iPhone UISlider用法

    移动滑动条就可以设置文字控件背景颜色的绿色纸 在文字控件中设置0~1.0的浮点值就卡可以设置文字控件背景颜色的红色值 核心带啊: float fAlpha = mySlider.value / ... [myTextField resignFirstResponder];

    IOS开发中取消文本框输入时的小键盘

    首先在Interface Builder中选择TextFields,然后在Text Field Attributes中找到Text Input Traits,选择Return Key为done。...[sender resignFirstResponder]; } 然后找到事件Did End On Exit,与t

    IOS关闭键盘的方法

    首先输入完成后按键盘上的done关闭键盘 首先在Interface Builder中选择TextFields,然后在Text Field Attributes中找到Text Input Traits,选择Return Key为done。...[sender resignFirstResponder

Global site tag (gtag.js) - Google Analytics