所以,我正在构建一个详细视图控制器应用程序,它提供一个包含两部分单元格的表格:标签和文本字段。
我试图检索文本字段值并将其添加到数组中。
我尝试使用" 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"在函数的第二行。
答案 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