子UIViewController中resignFirstResponder等方法失效问题求助
这种情况我做嵌套VC开发时也踩过坑,核心问题基本都和响应链断裂有关,给你几个排查和解决的思路:
检查子VC视图的完整添加流程
你调用了addChildViewController(viewController)和viewController.didMove(toParentViewController: self),但别忘了最关键的一步:把子VC的视图添加到主VC的视图层级里:self.view.addSubview(viewController.view) // 记得设置子视图的frame或者约束,确保它在主视图内 viewController.view.frame = self.view.bounds如果子视图没有被正确添加到主视图的层级中,它的响应链就无法和主VC甚至window连通,导致
resignFirstResponder()无法生效。强制从Window层级结束编辑
有时候主VC的view可能不是当前keyWindow的直接子视图,试试直接让window结束编辑:UIApplication.shared.keyWindow?.endEditing(true)这招在响应链有断点的时候经常能生效,因为window是响应链的顶端。
递归查找并收起第一响应者
如果上面的方法都不行,可以手动遍历所有视图找到当前的第一响应者,然后强制让它 resign:extension UIView { func findFirstResponder() -> UIView? { if isFirstResponder { return self } for subview in subviews { if let responder = subview.findFirstResponder() { return responder } } return nil } } // 在需要收起键盘的地方调用 if let firstResponder = self.view.findFirstResponder() { firstResponder.resignFirstResponder() }这个方法会递归遍历所有子视图(包括子VC里的视图),找到正在响应的输入框并收起键盘。
检查TextField的Delegate和响应属性
确认你的UITextField的delegate已经正确设置,并且在textFieldShouldReturn(_:)方法里正确调用了resignFirstResponder():func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true }另外还要确保textField和它的父视图的
isUserInteractionEnabled都是true,如果这个属性被设为false,也会导致响应链失效。
内容的提问来源于stack exchange,提问作者Alessandro

