使用Swift在UITableViewCell中获取UITextField的indexPath

Nun*_*ira 8 uitableview ios swift

因此,我正在构建一个详细视图控制器应用程序,它提供一个包含两部分单元格的表格:标签和文本字段.

我正在尝试检索文本字段值并将其添加到数组中.我尝试使用" textField.superview.superview"技术,但它没有奏效.

func textFieldDidEndEditing(textField: UITextField!){
    var cell: UITableViewCell = textField.superview.superview
    var table: UITableView = cell.superview.superview
    let textFieldIndexPath = table.indexPathForCell(cell)
}
Run Code Online (Sandbox Code Playgroud)

Xcode无法构建并呈现" UIView不可转换为UITableViewCell"和"转换UITableView".引用表有两个部分,分别为四行和两行.

提前致谢.

编辑:在函数的第二行添加".superview".

Cez*_*zar 23

虽然当前接受的答案可能有效,但它假设一个特定的视图层次结构,这不是一种可靠的方法,因为它很容易发生变化.

要到indexPathUITextField一个细胞内,这是更好的去与以下内容:

func textFieldDidEndEditing(textField: UITextField!){
    let pointInTable = textField.convertPoint(textField.bounds.origin, toView: self.tableView)
    let textFieldIndexPath = self.tableView.indexPathForRowAtPoint(pointInTable)
}
Run Code Online (Sandbox Code Playgroud)

这将继续独立于视图层次结构的最终更改.


lax*_*nal 7

使用superview和类型转换不是首选的方法.最佳做法是使用委托模式.如果你在DemoTableViewCell中使用了一个textField,你在DemoTableViewController中使用了一个协议DemoTableViewCellDelegate并将DemoTableViewCell的委托分配给DemoTableViewController,以便在eiditing在textfield结束时通知viewcontroller.

protocol DemoTableViewCellDelegate: class {
  func didEndEditing(onCell cell: DemoTableViewCell)
}

class DemoTableViewCell: UITableViewCell {
  @IBOutlet var textField: UITextField!

  weak var delegate: DemoTableViewCellDelegate?

  override func awakeFromNib() {
    super.awakeFromNib()
    textField.delegate = self
  }
}

extension DemoTableViewCell: UITextFieldDelegate {
  func textFieldDidEndEditing(_ textField: UITextField) {
    delegate.didEndEditing(onCell: self)
  }
}

class DemoTableViewController: UITableViewController {

  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: DemoTableViewCell.self, for: indexPath)
    cell.delegate = self
    return cell
  }

}

extension DemoTableViewController: DemoTableViewCellDelegate {
  func didEndEditing(onCell cell: DemoTableViewCell) {
    //Indexpath for the cell in which editing have ended.
    //Now do whatever you want to do with the text and indexpath.
    let indexPath = tableView.indexPath(for: cell)
    let text = cell.textField.text
  }
}
Run Code Online (Sandbox Code Playgroud)


Con*_*nor 6

你需要在函数中强制转换第一行和第二行,如下所示:

func textFieldDidEndEditing(textField: UITextField!){
    var cell: UITableViewCell = textField.superview.superview as UITableViewCell
    var table: UITableView = cell.superview as UITableView
    let textFieldIndexPath = table.indexPathForCell(cell)
}
Run Code Online (Sandbox Code Playgroud)

superview返回一个UIView,因此你需要将它转换为你期望的视图类型.