在 Swift 中从 TableView 动态单元格中的文本字段读取数据 [英] Read Data From Text Field in TableView Dynamic Cell in Swift

查看:57
本文介绍了在 Swift 中从 TableView 动态单元格中的文本字段读取数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想阅读表格视图中动态单元格中文本字段中的文本.

I want to read the text in the text fields in my dynamic cells in the table view.

每个单元格有两个文本字段,用户可以添加更多单元格.

Each cell has two text fields and the user can add more cells.

我的问题:如何从文本字段 (textField1 & textField2) 中读取值并将它们添加到我的卡片结构中?

My question : How can I read the values from text fields (textField1 & textField2) and add them to my cards struct?

在 Cards 结构中有两个变量.frontLabel 和 backLabel 作为字符串

In the Cards struct there are two variables. frontLabel and backLabel as string

我的表视图:

class AddFCViewController: UIViewController  {

   
    var numberOfTextFields = 1
    var cards = [Cards]()
    
    
    
    // Table View
    let tableView : UITableView = {
        let tableView = UITableView()
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.backgroundColor = .purple
        
        return tableView
    }()
    
   
    // Add Button
    let addButtton : UIButton = {
       let btn = UIButton()
        btn.translatesAutoresizingMaskIntoConstraints = false
        btn.backgroundColor = .link
        btn.setTitle("Ekle", for: .normal)
        return btn
    }()
    
  
    override func viewDidLoad() {
        super.viewDidLoad()
        
        configureTableView()
        configureAddButton()


        
    }
    
    
   
    
    // MARK: - Configure Add Button
    func configureAddButton() {
        view.addSubview(addButtton)
       
        addButtton.addTarget(self, action: #selector(addButtonTapped(sender:)), for: .touchUpInside)
    }
    
    // MARK: - Add Button Tapped MEthod
    @objc func addButtonTapped(sender: UIButton){
        numberOfTextFields += 1
        tableView.reloadData()
    }
    
 
    // MARK: - Configure Table View
    func configureTableView() {
        view.addSubview(tableView)
        setTableViewDelegates()
        
        tableView.rowHeight = 100
        tableView.register(AddFCCell.self, forCellReuseIdentifier: "AddFCCell")
       
        
    }
    
    // MARK: - Table View Delegates
    func setTableViewDelegates() {
        tableView.delegate = self
        tableView.dataSource = self
    }
}


// MARK: - Table View Extension & Delegate Methods

extension AddFCViewController: UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return numberOfTextFields
    }
    
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "AddFCCell") as! AddFCCell
        cell.selectionStyle = .none
        cell.textField1.tag = indexPath.row
        cell.textField2.tag = indexPath.row
        print(cell.textField1.tag)
        print(cell.textField2.tag)
        
//        cell.textField1.text = cards[indexPath.row].frontLabel
//        cell.textField2.text = cards[indexPath.row].backLabel
  

        cell.textField1.delegate = self
        

        cell.backgroundColor = .purple

        return cell
    }
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 10
    }
    
    func textFieldDidBeginEditing(_ textField: UITextField) {
//        textField.addTarget(self, action: #selector(valueChanged), for: .editingChanged)
    }
   
  
    
}

这是我的自定义单元类.

Here is my custom Cell Class.

class AddFCCell: UITableViewCell {
   
    
    // MARK: - Text Field 1
    let textField1 : UITextField = {
        let textField = UITextField()
        textField.translatesAutoresizingMaskIntoConstraints = false
        textField.backgroundColor = .white
        textField.isUserInteractionEnabled = true
        textField.placeholder = "TYPE HERE SOMETHING"
        textField.font = UIFont.systemFont(ofSize: 20)

        return textField
    }()
    
    
    // MARK: - Text Field 2
    let textField2 : UITextField = {
        let textField = UITextField()
        textField.translatesAutoresizingMaskIntoConstraints = false
        textField.backgroundColor = .white
        textField.isUserInteractionEnabled = true
        textField.placeholder = "TYPE HERE SOMETHING"
        textField.font = UIFont.systemFont(ofSize: 20)

        return textField
    }()

    // MARK: - view Did Load
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        contentView.addSubview(textField1)
        contentView.addSubview(textField2)
        
        configureTextBox1(textField: textField1)
        configureTextBox2(textField: textField2)
    }
  
    
    // MARK: - Configure Text Box 1 Function
    func configureTextBox1(textField : UITextField) {
        
        textField.layer.cornerRadius = 20
     
    }
    
    // MARK: - Configure Text Box 2 Function
    func configureTextBox2(textField : UITextField) {
        
        textField.layer.cornerRadius = 20
     
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

PS - 我删除了一些约束代码,因为那里的代码太多了.

PS - I deleted some of my constraints code as it was just too much code there.

推荐答案

我会改变一些事情,

1. 去掉 numberOfTextFields

2.使用varcards = [Cards]()返回tableView中的单元格数量

2. Use var cards = [Cards]() to return the number of cells in tableView

3. 使用单个 Cards 实例初始化 cards 并将其属性设置为 nil.所以我将卡片实现为

3. Initialize cards with a single Cards instance and set its property to nil. So I would have Cards implementation as

struct Cards {
    var frontLabel: String?
    var backLabel: String?
}

4.cards 数组初始化为

var cards = [Cards()]

5. 从数组 count 中返回行数

5. Return number of rows from arrays count

    func numberOfSections(in tableView: UITableView) -> Int {
        return cards.count
    }

6. 我会将文本字段委托职责迁移到 Cell 而不是将其移动到 ViewController 并且我将在 AddFCCell 中有一个委托来更新有关文本更改的 ViewController

6. I would migrate text field delegate responsibilities to Cell instead of moving it to ViewController and I would have a delegate in AddFCCell to update the ViewController about text changes

@objc protocol AddFCCellDelegate {
    func updateCard(with frontText: String?, backText: String?, for cell: AddFCCell)
}

class AddFCCell: UITableViewCell {
    weak var delegate:AddFCCellDelegate?
    //.... other codes of yours
}

extension AddFCCell: UITextFieldDelegate {
    func textFieldDidEndEditing(_ textField: UITextField) {
        self.delegate?.updateCard(with: self.textField1.text, backText: self.textField2.text, for: self)
    }
}

7. 最后,在viewController中实现/确认AddFCCellDelegate并重新加载TableView bu更新文本

7. Finally, implement/confirm to AddFCCellDelegate in viewController and reload TableView bu updating text

extension ViewController: AddFCCellDelegate {
    func updateCard(with frontText: String?, backText: String?, for cell: AddFCCell) {
        guard let indexPath = self.tableView.indexPath(for: cell) else {
            return
        }
        self.cards[indexPath.row].frontLabel = frontText
        self.cards[indexPath.row].backLabel = backText
        self.tableView.reloadRows(at: [indexPath], with: .automatic)
    }
}

8. 更新 CellForRowAtIndexPath

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "AddFCCell") as! AddFCCell
        cell.selectionStyle = .none
        cell.delegate = self
        cell.textField1.text = cards[indexPath.row].frontLabel
        cell.textField2.text = cards[indexPath.row].backLabel


        cell.backgroundColor = .purple

        return cell
    }

您显然可以实现一个有效的协议,并根据所有修改过的 textField 仅返回/更新 Cards 结构中的特定变量,但此处发布的代码只是为了给您一个想法并开始使用

You can obviously implement a efficient protocol and return/update only specific variable in Cards struct based on which textField was modified n all, but the code posted here is only to give you an idea and to get started with

编辑 1:

确保您已正确设置 TextFields 委托

Make sure you have set your TextFields delegate right

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        contentView.addSubview(textField1)
        textField1.delegate = self
        contentView.addSubview(textField2)
        textField2.delegate = self

        configureTextBox1(textField: textField1)
        configureTextBox2(textField: textField2)
    }

这篇关于在 Swift 中从 TableView 动态单元格中的文本字段读取数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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