gpt4 book ai didi

ios - 从自定义 uitableview 单元格获取 uitextfield 数据 - Swift

转载 作者:行者123 更新时间:2023-11-28 15:24:47 24 4
gpt4 key购买 nike

我对带有文本字段的自定义表格 View 单元格有疑问。所以,我有一个单独的类用于带有文本字段的单元格,但我无法在我的 tableview 类中检索数据。 tableview 类和 textFieldShouldReturn 函数中有一个文本字段委托(delegate),但是当我按下“完成”按钮时没有任何反应。哪里会出问题?

非常感谢!

这是 TableView 的代码:

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))

因此,当您创建新的 textField 时,它不再有分配给它的委托(delegate)。这就是为什么没有任何东西触发 textFieldShouldReturntextFieldDidEndEditing 的原因。

UITextField(frame: ..) 行替换为:

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

接下来,考虑使用回调闭包,而不是传入“数据对象”来尝试和操作。

将您的单元格类更改为:

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

关于ios - 从自定义 uitableview 单元格获取 uitextfield 数据 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45410881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com