Ios TableViewController/自定义单元格-can';不要移动到下一个文本字段

Ios TableViewController/自定义单元格-can';不要移动到下一个文本字段,ios,swift,uitableview,Ios,Swift,Uitableview,我有一个带有自定义单元格的表视图控制器,其中包含一个文本字段——基本上是一个表单 当用户按键盘上的“回车”键时,我想自动转到下一个文本字段,但由于某些原因,我的解决方案不起作用 在TableViewController中,我执行以下操作: override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = table

我有一个带有自定义单元格的表视图控制器,其中包含一个文本字段——基本上是一个表单

当用户按键盘上的“回车”键时,我想自动转到下一个文本字段,但由于某些原因,我的解决方案不起作用

在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
在自定义表格视图单元格中,我有

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)始终为零。我不知道为什么,因为我清楚地设置了标记,并将其标记为委托。谢谢。

它应该是零,因为textField.superview是您的单元格类。。。并且您的单元格类没有带有必需标记的视图。。所以它将返回零

import UIKit
  extension UIView {
    func lookForSuperviewOfType<T: UIView>(type: T.Type) -> T? {
        guard let view = self.superview as? T else {
            return self.superview?.lookForSuperviewOfType(type: type)
        }
        return view
    }
}
您的功能将变得

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    let tableView = self.view.lookForSuperviewOfType(type: UITableView.self)
    if let cell = tableView?.cellForRow(at: IndexPath(row: textField.tag+1, section: 0)) as? CustomCell {
        cell.box.becomeFirstResponder()
    } else {
         textField.resignFirstResponder()
    }
      return true
    }

为@jawadAli的有效的答案添加了一些清晰的内容和更多的建议,因为我觉得您对iOS开发还是新手

您正试图从文本字段中获取
表格视图
。但您无法通过引用textField的超级视图来获得它。因为视图层次结构如下所示:

UITableView>UITableViewCell>contentView>您的文本字段

视图层次结构中还可能有更多视图,因此需要继续遍历superview链,直到获得
UITableView
。@jawadAli已经发布了如何获得它的代码

但总的来说,这是一种不正确的方法。您应该使用委托。也就是说,当您的手机辞去第一响应者的职务时,它应该调用一个方法。您的表视图控制器将接收该调用

然后,视图控制器必须获取下一个单元格,并使其成为第一响应者

如果这对你来说没有任何意义,那么我强烈建议你学习授权。它在iOS的库中无处不在

编辑:

使用授权的方法

创建一个协议,比如说
CellDelegate
,它有一个类似于
func-didFinishDataCapture(forCell:UITableViewCell)
的函数

单元格将具有类型为
celldegate
delegate
属性

控制器将符合
CellDelegate
,并将自身设置为
func tableView(tableView:UITableView,cellForRowAt indexPath:indexPath)中的单元格委托。

现在在您的单元格中,当您处理完文本字段(您将其称为单元格将是文本字段的委托)后,您可以调用自己的委托函数,即
delegate.didFinishDataCapture(forCell:self)


在控制器中执行
didfishdatacapture
时,您将知道哪个单元格已完成数据捕获,并可以将逻辑放在下一步操作上。

所有文本字段是否都在同一单元格中?是的,正确,同一单元格将被不同内容重用。嘿,谢谢您的评论。我确实尝试过授权,但没有用。我也在使用UITextFieldDelegate-这不应该为我这样做吗?例如,在我的表视图控制器中:我设置了cell?.delegate=self,然后在func tableView中放入了一些逻辑(u tableView:UITableView,didSelectRowAt indexath:indexPath)。但这并不奏效。我同意你的观点,这是更干净的-你能不能放一个代码片段来举个例子?这会有很大帮助。如果我理解正确,您尝试将UITextFieldDelegate设置为控制器。这意味着控制器是所有单元格中所有文本字段的委托。问题在于,除非在文本字段和单元格之间保持映射,否则如何将单元格关联到表视图。这种方法并不正确。在我的答案中张贴正确的方法。请参见编辑。
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    let tableView = self.view.lookForSuperviewOfType(type: UITableView.self)
    if let cell = tableView?.cellForRow(at: IndexPath(row: textField.tag+1, section: 0)) as? CustomCell {
        cell.box.becomeFirstResponder()
    } else {
         textField.resignFirstResponder()
    }
      return true
    }