如何在点击按钮时将 Tableview 单元格内的文本字段中的数据打印到控制台

How to Print data from textfield present inside Tableview cell to console on tapping button

我想打印来自 tableview 单元格内的文本字段的数据,以便在单击 tableview 外的按钮时进行控制。 当我使用按钮的 IBAction 方法打印数据时,我只获取单行数据。 这是我更新后的代码供参考。

//Deliverview cell
import UIKit
//Protocol
protocol  Delivery {
    func OnClick(index : Int)
}
class DeliveryViewCell: UITableViewCell {
    @IBOutlet weak var cellTextField: UITextField!
    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var cellImageView: UIImageView!
    var celldelegate : Delivery?
    var index : IndexPath?
    var data: DeliveryData? {
        didSet {
            updateCell()
        }
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        cellTextField.borderStyle = .none
        cellTextField.delegate = self
        // Initialization code
    }
    func updateCell() {
        if let data = data {
            cellTextField.text = data.value
            cellTextField.placeholder = data.placeholder
        }
    }

    @IBAction func pickLocation(_ sender: Any) {
        celldelegate?.OnClick(index: index!.row)
    }
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}
extension DeliveryViewCell: UITextFieldDelegate {
    func textFieldDidEndEditing(_ cellTextField: UITextField) {
        deliveryData1.value = cellTextField.text!
    }
}
//View controller
class DeliveryData {
    let placeholder: String
    var value: String = ""
    
    init(_ placeholder: String) {
        self.placeholder = placeholder
    }
}

var deliveryData1: [DeliveryData] = [
    DeliveryData("Name"),
    DeliveryData("Phone"),
    DeliveryData("Email"),
    DeliveryData("order"),
    DeliveryData("Address"),
    DeliveryData("Date"),
    DeliveryData("Description"),
    DeliveryData("Barcode"),
    DeliveryData("Image")
]

根据您描述问题的方式,我相信您正在尝试打印与特定单元格关联的文本字段的值。您有多种方法可以实现。

方法一(最简单)

在这种情况下,对于初学者来说最简单的是以下内容。 更改您的 cellForRowAt 以执行以下操作:

let cell = deliveryTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DeliveryViewCell
cell.cellTextField.placeholder = deliveryData[indexPath.row]
//button refers to the button Outlet you have or should create.
cell.button.tag = indexPath.row 
return cell

然后将按钮的操作更改为:

@IBAction func tapSaveData(_ sender: UIButton) {
    let row = sender.tag //The tag you saved when dequeuing the cell
    let cell1 = deliveryTableView.cellForRow(at: IndexPath.init(row: row, section: 0)) as! DeliveryViewCell

    print(cell1.cellTextField.text!)
}

方法二

您可以简单地在单元格内使用闭包。

所以假设这是您的自定义单元格的一部分:

... your code

var onTextFieldEndEditing: ((String?) -> Void)?
    
func textFieldDidEndEditing(_ textField: UITextField) {
    //when editing is done.
    onTextFieldEndEditing?(textField.text)
}

然后,在你的 cellForRowAt:

let cell = deliveryTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DeliveryViewCell
cell.cellTextField.placeholder = deliveryData[indexPath.row]
cell.onTextFieldEndEditing = { [weak self] text in
    print(text)
}
return cell

在方法 2 中,您不再需要按钮的 @IBAction 或按钮本身。 如果您仍然希望在点击按钮时调用打印,您可以简单地在单元格本身内创建一个 @IBAction ,然后在点击按钮而不是文本字段结束编辑时调用闭包。 如果您还有其他问题,请告诉我。

UITableViewCells 并不意味着存储状态。当您滚动时,单元格将被重新使用,并且它们可能具有的任何值(即用户输入的文本)都将丢失。

此问题的解决方案是保存用户对数据模型所做的任何更改。这可以是 class、数组、字典等。在您的情况下,DeliveryViewCell 需要符合 UITextFieldDelegate 以便在用户完成编辑时收到通知:

extension DeliveryViewCell: UITextFieldDelegate {
    func textFieldDidEndEditing(_ textField: UITextField) {
        //Do something here to save the text...
    }
}

然后只需将更新后的文本存储在某处即可。这是一种选择,尽管绝不是唯一甚至最好的方法:

//In your cell
var data: DeliveryData? {
    didSet {
        updateCell()
    }
}

override func awakeFromNib() {
    super.awakeFromNib()

    textField.delegate = self
}

func updateCell() {
    if let data = data {
        textField.text = data.value
        textField.placeholder = data.placeholder
    }
}

extension DeliveryViewCell: UITextFieldDelegate {
    func textFieldDidEndEditing(_ textField: UITextField) {
        deliveryData?.value = textField.text!
    }
}

//In your view controller
class DeliveryData {
    let placeholder: String
    var value: String = ""

    init(_ placeholder: String) {
        self.placeholder = placeholder
    }
}
var deliveryData: [DeliveryData] = [
    DeliveryData("Name"),
    DeliveryData("Phone"),
    DeliveryData("Email"),
    DeliveryData("order"),
    DeliveryData("Address"),
    DeliveryData("Date"),
    DeliveryData("Description"),
    DeliveryData("Barcode"),
    DeliveryData("Image")
]

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = deliveryTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DeliveryViewCell

    cell.data = deliveryData[indexPath.row]

    return cell
}

@IBAction func tapSaveData(_ sender: Any) {
    for data in deliveryData {
        print(data.value)
    }
}

这还有一个额外的好处,即在单元格滚动回视图时恢复用户键入的任何文本。