从自定义的uitableview单元格获取uitextfield数据 – Swift

我有一个问题与自定义tableview单元格与文本字段。 所以,我有一个单独的类与文本字段的单元格,但我无法检索我的tableview类中的数据。 在tableview类和textFieldShouldReturn函数中有一个textfield的委托,但是当我按下“Done”button时没有任何反应。 哪里可以成为一个问题?

非常感谢!

这里是表视图的代码:

class MainTVC: UITableViewController, UITextFieldDelegate{ var tableParts: [Dictionary<String, Any>] = [] override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(true) tableParts = [ ["type": "title", "data": "Some data", "enabled": true], ["type": "date", "data": "Some data", "enabled": true], ["type": "location", "data": "Loading...", "enabled": true], ] tableView.reloadData() } override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self } override func numberOfSections(in tableView: UITableView) -> Int { return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return tableParts.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell = tableParts[indexPath.row] switch(cell["type"] as! String) { ... case "textbox": let rTemplateTextBox = tableView.dequeueReusableCell(withIdentifier: "recapTextCell", for: indexPath) as! RTextCell rTemplateTextBox.textField.text = cell["data"] as? String ?? "No text" rTemplateTextBox.data = cell return rTemplateTextBox default: let cell = tableView.dequeueReusableCell(withIdentifier: "defCell", for: indexPath) cell.textLabel?.text = "Unknown type of cell!" return cell } } func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() print("Should return!") return true } } 

而对于一个细胞:

 class RTextCell: UITableViewCell, UITextFieldDelegate { var textField = UITextField() var data: Dictionary<String, Any>? override func awakeFromNib() { super.awakeFromNib() textField.delegate = self let padding = UIView(frame: CGRect(x:0, y:0, width: 15, height: self.frame.height)) textField = UITextField(frame: CGRect(x:0, y:0, width: self.frame.width, height: 40)) textField.placeholder = "Your text here" textField.textColor = UIColor.white textField.tintColor = UIColor.white textField.backgroundColor = UIColor.clear textField.leftView = padding textField.leftViewMode = .always self.addSubview(textField) } func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() print("Should return") return true } func textFieldDidEndEditing(_ textField: UITextField) { if data != nil { data!["data"] = textField.text print("DATA: \(data!)") } else { print("No data") } } } 

第一个问题 – 在你的单元类中,在awakeFromNib()你有:

 // CREATE a UITextField var textField = UITextField() var data: Dictionary<String, Any>? override func awakeFromNib() { super.awakeFromNib() // assign self as the delegate of textField textField.delegate = self let padding = UIView(frame: CGRect(x:0, y:0, width: 15, height: self.frame.height)) // CREATE a NEW UITextField textField = UITextField(frame: CGRect(x:0, y:0, width: self.frame.width, height: 40)) 

所以,当你创build新的textField时,它不再有一个委托给它。 这就是为什么没有触发textFieldShouldReturntextFieldDidEndEditing

UITextField(frame: ..)行replace为:

  textField.frame = CGRect(x:0, y:0, width: self.frame.width, height: 40) 

接下来,不要传入“数据对象”然后尝试和操作,请考虑使用callback闭包。

将您的单元格类更改为:

 class RTextCell: UITableViewCell, UITextFieldDelegate { var textField = UITextField() // this will be our "call back" closure var didEndEditAction : ((String)->())? override func awakeFromNib() { super.awakeFromNib() textField.delegate = self let padding = UIView(frame: CGRect(x:0, y:0, width: 15, height: self.frame.height)) // just set the frame, don't create a NEW textField textField.frame = CGRect(x:0, y:0, width: self.frame.width, height: 40) textField.placeholder = "Your text here" textField.textColor = UIColor.white textField.tintColor = UIColor.white textField.backgroundColor = UIColor.clear textField.leftView = padding textField.leftViewMode = .always self.addSubview(textField) } func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() print("Should return") return true } func textFieldDidEndEditing(_ textField: UITextField) { // call back using a closure didEndEditAction?(textField.text ?? "") } } 

然后像这样configuration它:

  case "textbox": let rTemplateTextBox = tableView.dequeueReusableCell(withIdentifier: "recapTextCell", for: indexPath) as! RTextCell rTemplateTextBox.textField.text = cell["data"] as? String ?? "No text" // setup the "call back" closure rTemplateTextBox.didEndEditAction = { (newText) in let cell = self.myData[indexPath.row] cell["data"] = newText } return rTemplateTextBox 

你可以在任何你声明tableView地方使用下面的代码来获取单元格的textField数据

 let indexPath = IndexPath(row: yourRow, section: yourSection) let cell:InputDataCell = yourTable.cellForRow(at: indexPath) as! InputDataCell if (cell.yourTextFieald.text?.characters.count)! { print(cell.yourTextFieald.text!) }