按下返回按钮时在 UITextField 之间切换
Posted
技术标签:
【中文标题】按下返回按钮时在 UITextField 之间切换【英文标题】:Switch between UITextFields when return button is pressed 【发布时间】:2018-11-11 19:44:39 【问题描述】:我试图让我的 UITextFields 在按下返回按钮时切换到下一个。这是我的代码:
func textFieldShouldReturn(_ textField: UITextField) -> Bool
// Try to find next responder
if let nextField = textField.superview?.superview?.viewWithTag(textField.tag + 1) as? UITextField
nextField.becomeFirstResponder()
print("success")
else //if textField.text != nil
textField.resignFirstResponder()
print("error")
return false
我一直将此代码用于其他项目。但是,这是一个例外。我在它自己的堆栈视图中拥有每个元素,并且所有这些堆栈视图都在超级视图堆栈视图中。运行应用程序后,我按下返回按钮,然后它转到 else 语句并辞去第一响应者的职务。我需要它来运行nextField.becomesFirstResponder()
Here is a screenshot
【问题讨论】:
有什么问题?? 你不是忘记设置每个文本字段的代表了吗? 我设置了代表和文本字段的标签。看截图。 从不假设 UI 组件的私有子视图结构。 我认为问题是,if let 语句在 superview 中找不到其他 textField,因为 superview 是由其他堆栈视图组成的堆栈视图,每个 textField 都有自己的堆栈视图. 【参考方案1】:解决私人问题
if let nextField = self.view.viewWithTag(textField.tag + 1) as? UITextField
但问题在于性能viewWithTag
在子视图中递归搜索
【讨论】:
谢谢。但是你说的性能问题是什么意思?【参考方案2】:创建 Outlet Collection 并将每个文本字段连接到它
@IBOutlet var textFields: [UITextField]!
在文本字段委托函数之后使用这个:
func textFieldShouldReturn(_ textField: UITextField) -> Bool
let nextIndex = textField.tag + 1
if textFields.count > nextIndex
let nextField = textFields[nextIndex]
nextField.becomeFirstResponder()
else
textField.resignFirstResponder()
return false
【讨论】:
虽然这可能会使代码工作,但这是一个糟糕的解决方案。永远不要对 UI 组件的私有子视图结构做任何假设。此代码可能会在以后的任何 ios 更新中停止工作。 此代码确实有效。但是,rmaddy 所说的私有子视图结构是我仍然需要帮助解决的。/ @Etiekyed 尝试编辑答案。这可能是实现您想要的正确方法。以上是关于按下返回按钮时在 UITextField 之间切换的主要内容,如果未能解决你的问题,请参考以下文章
按下按钮和文本字段切换后 UITextField 失去焦点(键盘保持可见)
按下按钮时在 UITableViewCell 中查找按钮的 indexPath?