我有一个带有自定义单元格的表格 View Controller ,其中包含一个文本字段 - 它基本上是一个表单。
当用户按键盘上的“return”时,我想自动转到下一个文本字段,但由于某种原因我的解决方案不起作用。
在 TableViewController 中,我这样做:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? CustomCell
cell?.box.tag = indexPath.row
在我的自定义表格 View 单元格中,我有
override func awakeFromNib() {
super.awakeFromNib()
box.delegate = self
...
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if let nextField = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
nextField.becomeFirstResponder()
} else {
textField.resignFirstResponder()
}
return true
}
问题是 textField.superview?.viewWithTag(textField.tag+1) 始终为零。我不知道为什么,因为我清楚地设置了标签并将其标记为委托(delegate)。谢谢你。
最佳答案
为 添加一些清晰度和更多建议有效 @jawadAli 的回答,因为我觉得你还是 iOS 开发的新手。
您正在尝试获取 tableView
从文本字段。但是引用 是得不到的。监督 的文本字段。因为 View 层次结构是这样的:
UITableView > UITableViewCell > contentView > 你的文本字段。
View 层次结构中还可以有更多 View ,因此您需要不断遍历父 View 链,直到获得 UITableView
. @jawadAli 已经发布了如何获取它的代码。
但总的来说,这是一种不正确的方法。您应该使用 代表团 . IE。当您的单元格辞去第一响应者的职务时,它应该调用一个方法。您的表格 View Controller 将收到该调用。
然后您的 View Controller 必须获取下一个单元格并使其成为第一响应者。
如果这对您没有任何意义,那么我强烈建议您学习委派。它在 iOS 的库中无处不在。
编辑:
使用委托(delegate)的方法。
创建一个协议(protocol),比如说 CellDelegate
具有类似 func didFinishDataCapture(forCell: UITableViewCell)
的功能.
该单元格将具有 delegate
CellDelegate
类型的属性.
Controller 将符合 CellDelegate
并将自己设置为 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
中的单元格的代表
现在在您的单元格中,当您完成文本字段(您知道单元格将是文本字段的委托(delegate))时,您调用自己的委托(delegate)函数,即 delegate.didFinishDataCapture(forCell: self)
.
在您的 didFinishDataCapture
的实现中在 Controller 中,您将知道哪个单元已完成数据捕获,并可以将逻辑放在下一步做什么。
关于ios - TableViewController/自定义单元格 - 无法移动到下一个文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61946100/