从自定义uitableview单元格获取uitextfield数据-Swift [英] Get uitextfield data from custom uitableview cell - Swift

查看:53
本文介绍了从自定义uitableview单元格获取uitextfield数据-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文本字段时,将不再为其分配委托.这就是为什么什么都不会触发textFieldShouldReturntextFieldDidEndEditing的原因.

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆