【问题标题】:Get uitextfield data from custom uitableview cell - Swift从自定义 uitableview 单元格获取 uitextfield 数据 - Swift
【发布时间】:2018-01-06 17:31:41
【问题描述】:

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

非常感谢!

这是表格视图的代码:

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

【问题讨论】:

  • 请包含您的UITableViewCell 子类和tableview 控制器类的相关代码。
  • @Cheslav 我认为我的回答解决了你的问题
  • 您在 RTextCell 类中设置 textfield.delegate。所以 textFieldShouldReturn 只能在那个类中工作。您将在哪里使用文本字段的数据。请解释一下?
  • @AadilAli 我想在我的 tableview 类中使用字段的文本,有一个字典,我想用每个文本字段的数据填充它。每个单元格中会有很多文本字段。
  • “完成”按钮是您单元格的一部分吗?

标签: ios iphone swift uitableview uitextfield


【解决方案1】:

您可以在声明 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!)                           
}

【讨论】:

    【解决方案2】:

    第一个问题——在你的单元格中,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))
    

    因此,当您创建 NEW 文本字段时,它不再具有分配给它的委托。这就是为什么没有触发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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多