使用Swift在UITableViewCell中获取UITextField的indexPath

时间:2014-06-06 01:56:30

标签: ios uitableview 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)
}

Xcode无法构建并显示" UIView无法转换为UITableViewCell"和"到UITableView"。 引用表分为两部分,分别为四行和两行。

提前致谢。

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

4 个答案:

答案 0 :(得分:19)

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

要从单元格内的indexPath转到UITextField,最好使用以下内容:

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

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

答案 1 :(得分: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
  }
}

答案 2 :(得分:5)

您希望在函数中转换第一行和第二行,如下所示:

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

superview返回一个UIView,因此您需要将其转换为您期望的视图类型。

答案 3 :(得分:-1)

您可以使用tag的{​​{1}}属性

UITableViewCell

现在在func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "UpdateTableViewCell", for: indexPath) as! UpdateTableViewCell cell.tag = indexPath.row cell.setCellData() return cell }

UITableViewCell