如何取消输入框第一响应者?新ViewController键盘无法收起问题
解决ViewController切换后键盘未收起的问题
我之前也碰到过一模一样的坑![self.view endEditing:YES] 失效通常是因为当前的第一响应者(也就是你的textField)不在你调用方法的view层级里,或是调用时机不对——比如已经开始加载新VC后才触发收起逻辑,这时当前view可能已经失去活跃状态了。
给你几个亲测有效的解决办法:
方法一:直接让目标TextField放弃第一响应者
如果你能拿到这个textField的引用(比如IBOutlet或者全局变量),直接调用它的 resign 方法最精准:
[self.yourTextField resignFirstResponder];
这种方式直接定位到正在编辑的控件,几乎不会出问题。
方法二:让应用主窗口强制结束编辑
要是不确定哪个控件是第一响应者,或者textField的引用不好获取,可以让整个应用的主窗口来处理:
[[UIApplication sharedApplication].keyWindow endEditing:YES];
这个方法会遍历窗口内所有控件,强制让第一响应者 resign,不管它在哪个view层级里,堪称万能方案。
方法三:调整VC切换的顺序
你会不会是在回调里先实例化新VC,再调用收起键盘的方法?试试调换顺序:先收键盘,再处理VC跳转:
// 先确保键盘收起 [[UIApplication sharedApplication].keyWindow endEditing:YES]; // 再实例化并跳转新VC NewViewController *newVC = [[NewViewController alloc] init]; [self.navigationController pushViewController:newVC animated:YES];
有时候因为VC切换的生命周期问题,晚调用收起逻辑时,当前view已经失去焦点,endEditing就起不了作用了。
方法四:在当前VC的生命周期里自动处理
如果想一劳永逸,直接在当前VC的viewWillDisappear:方法里添加收起键盘的逻辑:
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[UIApplication sharedApplication].keyWindow endEditing:YES]; }
这样只要当前VC的view即将消失(不管是push还是present新VC),都会自动收起键盘,不用每次跳转前单独处理。
内容的提问来源于stack exchange,提问作者AsimRazaKhan
相关产品推荐
相关产品推荐

