使用单个公用UITextField复用生成多输入框时如何按回车键跳转下一个
故障原因
- 原代码仅在当前输入框的直接父视图(对应单条cell的contentView)范围内查找下一个响应者,其余输入框位于不同cell的视图层级下,无法通过
viewWithTag匹配到,因此跳转失效 - 代码中多处使用强制解包,一旦找不到对应视图会直接触发闪退,稳定性差
- 未验证查找到的视图类型是否为UITextField,可能拿到其他类型视图调用方法报错
修复后代码
func textFieldShouldReturn(_ textField: UITextField) -> Bool { let nextTag = textField.tag + 1 // 从tableView全量层级查找对应tag的输入框 guard let tableView = textField.superview?.superview?.superview as? UITableView, let nextTextField = tableView.viewWithTag(nextTag) as? UITextField else { // 找不到下一个输入框则收起键盘 textField.resignFirstResponder() return false } nextTextField.becomeFirstResponder() return false }
注意事项
- 4个输入框的tag需要按顺序设置为0、1、2、3,不能跳号,也不能和tableView内其他视图的tag重复
- 如果后续cell数量会动态变化,更稳定的方案是持有所有输入框的数组,根据当前输入框的索引查找下一个,避免tag冲突问题
内容的提问来源于stack exchange,提问作者Dhiren
相关产品推荐
相关产品推荐

