重写resignFirstResponder时,返回textField的resign结果是否正确?
关于自定义视图重写
resignFirstResponder()的实现判断 你的第一种实现方式是正确且更符合需求的,原因如下:
- 先满足文档硬性要求:重写该方法时必须调用
super.resignFirstResponder(),两种实现都做到了这一点,但返回值的语义才是核心差异。 resignFirstResponder()的返回值代表当前视图是否成功放弃第一响应者状态。对于你的自定义视图来说,真正持有第一响应者、关联键盘的是内嵌的textField,所以方法的返回值应该反映textField是否成功收起键盘,而非自定义视图本身的父类实现结果(默认总是返回true)。- 第二种实现的问题在于:如果
textField因为输入校验未通过、编辑锁定等原因无法放弃第一响应者,此时textField.resignFirstResponder()会返回false,但方法最终返回的是super.resignFirstResponder()的true,这会给调用者传递错误的状态信息,误以为键盘已成功隐藏。
额外补充:如果你的CustomView本身有可能成为第一响应者(比如实现了canBecomeFirstResponder并返回true),可以调整逻辑为综合两者的结果:
override func resignFirstResponder() -> Bool { let textFieldResigned = textField.resignFirstResponder() let superResigned = super.resignFirstResponder() return textFieldResigned && superResigned }
但如果你的自定义视图本身不会成为第一响应者,第一种实现就完全足够。
内容的提问来源于stack exchange,提问作者Heuristic
相关产品推荐
相关产品推荐

