尝试使用委托共享来自自定义 tableViewCell 和数据的文本输入未共享

问题描述

我正在尝试使用委托方法自定义单元格按钮按下获取数据到 ViewController 中的数组中。

按钮运行良好,如果 let 运行良好但数据没有像我想要的那样从自定义单元格按钮转移到 ViewController 数组...

我对编码还是很陌生,所以我知道我做错了很明显的事情。我正在从 SO 应用以下内容

Getting Textfield Values from Custom Table View Cell

How to get user input from UItextfield and add it to an array?

我的自定义单元格:

import UIKit

class AddEntrantCell: UITableViewCell,UITextFieldDelegate {

var entrantName: ((String) -> Void)?
var entrantCompany: ((String) -> Void)?

@IBOutlet weak var entrantNameTextField: UITextField!
@IBOutlet weak var entrantCompanyTextField: UITextField!
@IBOutlet weak var addEntrant: UIButton!

var delegate: CellDelegate?

override func awakeFromNib() {
    super.awakeFromNib()
    entrantNameTextField.delegate = self
    entrantCompanyTextField.delegate = self
            
    if Global.uiMode == true {
        overrideUserInterfaceStyle = .light
    } else {
        overrideUserInterfaceStyle = .dark
    }
}

override func setSelected(_ selected: Bool,animated: Bool) {
    super.setSelected(selected,animated: animated)
}

// Button press
@IBAction func addEntrantButton(_ sender: UIButton) {
    if let name = entrantNameTextField.text,let company = entrantCompanyTextField.text {
        delegate?.addEntrants(name: name,company: company)
    }
}
}

我的 VC 与 tableView:

import UIKit

protocol CellDelegate {
func addEntrants(name: String,company: String)
}

class EntrySec: UIViewController,CellDelegate {

@IBOutlet weak var spaceStatus: UIButton!
@IBOutlet weak var entrantsTable: UITableView!

var entryGrid: [Entrant] = [
    Entrant(name: "",company: ""),Entrant(name: "Bob Lob",company: "Blue"),Entrant(name: "John Lon",company: "Red")
]

override func viewDidLoad() {
    super.viewDidLoad()
    entrantsTable.dataSource = self
    entrantsTable.register(UINib(nibName: Global.headerCellNibName,bundle: nil),forCellReuseIdentifier: Global.headerCellIdentifier)
    entrantsTable.register(UINib(nibName: Global.bodyCellNibName,forCellReuseIdentifier: Global.bodyCellIdentifier)
    
    if Global.uiMode == true {
        overrideUserInterfaceStyle = .light
    } else {
        overrideUserInterfaceStyle = .dark
    }
}

func addEntrants(name: String,company: String) {
    entryGrid.append(Entrant(name: name,company: company)) // This does not work
    print("\(name)  \(company)")                            // This does not work
}
    
@IBAction func pauseSession(_ sender: UIButton) {
}
@IBAction func closeSession(_ sender: UIButton) {
}
@IBAction func menu(_ sender: UIButton) {
}
}

extension EntrySession: UITableViewDataSource {
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
    return entryGrid.count
}

func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        let addEntrantCell = entrantsTable.dequeueReusableCell(withIdentifier: Global.headerCellIdentifier,for: indexPath) as! AddEntrantCell
        addEntrantCell.entrantNameTextField.text = entryGrid[indexPath.row].name
        addEntrantCell.entrantCompanyTextField.text = entryGrid[indexPath.row].company
        return addEntrantCell
    } else {
        let entrantCell = entrantsTable.dequeueReusableCell(withIdentifier: Global.bodyCellIdentifier,for: indexPath) as! EntrantCell
        entrantCell.textLabel?.text = entryGrid[indexPath.row].name
        if entrantCell.textLabel?.text == "" {
            entrantCell.backgroundColor = #colorLiteral(red: 0.9764705882,green: 0.4274509804,blue: 0,alpha: 1)
            entrantCell.alpha = 0.5
        }
        return entrantCell
    }
}
}

解决方法

您尚未在 cellForRowAt 中设置单元格委托。所以你必须在 CellDelegate 方法中设置 cellForRowAt。像这样。

func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        let addEntrantCell = entrantsTable.dequeueReusableCell(withIdentifier: Global.headerCellIdentifier,for: indexPath) as! AddEntrantCell
        addEntrantCell.delegate = self // <--- Add delegate here
        addEntrantCell.entrantNameTextField.text = entryGrid[indexPath.row].name
        addEntrantCell.entrantCompanyTextField.text = entryGrid[indexPath.row].company
        return addEntrantCell
    } else {
        let entrantCell = entrantsTable.dequeueReusableCell(withIdentifier: Global.bodyCellIdentifier,for: indexPath) as! EntrantCell
        entrantCell.textLabel?.text = entryGrid[indexPath.row].name
        if entrantCell.textLabel?.text == "" {
            entrantCell.backgroundColor = #colorLiteral(red: 0.9764705882,green: 0.4274509804,blue: 0,alpha: 1)
            entrantCell.alpha = 0.5
        }
        return entrantCell
    }
}

您也可以使用闭包代替委托。 (您已经添加了代码但需要一些更正)

使用此更新您的单元格类并删除其他闭包。

var entrants: ((String,String) -> Void)?

@IBAction func addEntrantButton(_ sender: UIButton) {
    if let name = entrantNameTextField.text,let company = entrantCompanyTextField.text {
        entrants?(name,company)
    }
}

并在 cellForRow 方法中,而不是设置委托添加此


func tableView(_ tableView: UITableView,for: indexPath) as! AddEntrantCell
        addEntrantCell.entrants = { name,company in
            entryGrid.append(Entrant(name: name,company: company))
        } // <--- Here
    
// Rest of the code here