从自定义uitableview单元格获取uitextfield数据-Swift [英] Get uitextfield data from custom uitableview cell - Swift
问题描述
我对带有文本字段的自定义tableview单元格有疑问.因此,对于具有文本字段的单元格,我有一个单独的类,但是无法在tableview类中检索数据.在tableview类和textFieldShouldReturn函数中有一个用于textfield的委托,但是当我按"Done"按钮时没有任何反应.哪里可能有问题?
I have a problem with custom tableview cell with a textfield. So, I have a separate class for a cell with a textfield, but I can't retrieve data in my tableview class. There is a delegate for textfield in tableview class and textFieldShouldReturn function but nothing happens when I press "Done" button. Where can be a problem?
非常感谢!
这是表格视图的代码:
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()
中,您具有:
First issue -- in your cell class, in awakeFromNib()
you have:
// 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))
因此,当您创建NEW文本字段时,将不再为其分配委托.这就是为什么什么都不会触发textFieldShouldReturn
或textFieldDidEndEditing
的原因.
So, when you create the NEW textField, it no longer has a delegate assigned to it. That's why nothing triggers textFieldShouldReturn
or textFieldDidEndEditing
.
将UITextField(frame: ..)
行替换为:
textField.frame = CGRect(x:0, y:0, width: self.frame.width, height: 40)
接下来,与其考虑传入数据对象"然后尝试进行操作,不如考虑使用回调闭包.
Next, instead of passing in a "data object" to then try and manipulate, think about using a call-back closure.
将您的单元格类别更改为此:
Change your cell class to this:
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 ?? "")
}
}
然后像这样配置它:
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
这篇关于从自定义uitableview单元格获取uitextfield数据-Swift的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!