使用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 } }