使用Swift获取UITableViewCell中的UITextField的indexPath

所以,我构build了一个Detail View Controller App,它提供了一个由两部分组成的表格:标签和文本字段。

我试图检索文本字段的值,并将其添加到数组。 我试图使用“ 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无法构build并提交“ UIView不能转换为UITableViewCell ”和“到UITableView ”。 引用表分别有四个和两个行的两个部分。

提前致谢。

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

你会想在你的函数中投入第一行和第二行,如下所示:

 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,所以你需要把它转换为你期望的视图types。

虽然目前被接受的答案可能有效,但是它假设了一个特定的视图层次结构,由于它容易发生变化,所以这不是一个可靠的方法。

要从单元格内的UITextField获得indexPath ,最好使用下面的代码:

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

这将继续独立于对视图层次结构的最终改变而工作。

使用超级视图和types转换不是首选的方法。 最好的做法是使用委托模式。 如果您在DemoTableViewController中使用了DemoTableViewCell中的textField,请创build一个协议DemoTableViewCellDelegate,并将DemoTableViewCell的委托分配给DemoTableViewController,以便在eiditing以文本字段结束时通知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 } }