从 ViewController Swift 中的 UITableViewCell 调用函数

Call function from UITableViewCell from in ViewController Swift

我需要在 plusBtnTapped 时从 TeamsVC 调用 TeamsCell 中的函数 deleteButtonShowHide。我试图用 protocol TeamsVCDelegate 来解决这个问题,但它不起作用(对我来说反之亦然。但我不知道如何实现 cell.teamsCellDelegate = 自己

TeamsCell

import UIKit

protocol TeamsCellDelegate {
    func deleteCell()
}



class TeamsCell: UITableViewCell {
    
    @IBOutlet weak var teamNameLbl: UILabel!
    @IBOutlet weak var deleteButton: UIButton!
    var teamsCellDelegate: TeamsCellDelegate?
    
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    
    
    func updateCell(team: team) {
        teamNameLbl.text = team.name
    }
    
    
    @IBAction func deleteButtonTapped(_ sender: Any) {
        debugPrint("delet tapped")
        //deleteButtonShowHide()
        findAndDeleteTeam()
        teamsCellDelegate?.deleteCell()
    }
    
    func findAndDeleteTeam() {
        for i in 0...teams.count - 1 {
            if teams[i].name == teamNameLbl.text {
                teams.remove(at: i)
                break
            }
        }
    }
    
    func deleteButtonShowHide(){
        if teams.count < 3 {deleteButton.isHidden = true}
        if teams.count > 2 {deleteButton.isHidden = false}
    }
    
}

extension TeamsCell: TeamsVCDelegate {
    func deleteButtonSH() {
        debugPrint("XXX")
        deleteButtonShowHide()
    } 
}

TeamsVC

import UIKit

protocol TeamsVCDelegate {
    func deleteButtonSH()
}

class TeamsVC: UIViewController, UITableViewDelegate, UITableViewDataSource {
   
    @IBOutlet weak var plusBtn: UIButton!
    @IBOutlet weak var teamsTable: UITableView!
    var teamsVCDelegate: TeamsVCDelegate?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        teamsTable.delegate = self
        teamsTable.dataSource = self
        teamsTable.rowHeight = 55
        teamsTable.isScrollEnabled = false
        teamsTable.backgroundColor = nil
        teamsTable.separatorStyle = .none
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return teams.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "TeamsCell") as? TeamsCell {
            cell.updateCell(team: teams[indexPath.row])
            cell.teamsCellDelegate = self
            return cell
        }
        return UITableViewCell()
    }
    
    @IBAction func plusBtnTapped(_ sender: Any) {
        plusBtnHide()
        addTeam()
        teamsTable.reloadData()
        teamsVCDelegate?.deleteButtonSH()
        print(teams)
    }
    
    func plusBtnShow() {
        if teams.count < 5 {plusBtn.isHidden = false}
    }
    
    func plusBtnHide() {
        if teams.count == 4 { plusBtn.isHidden = true}
    }
    
}

extension TeamsVC: TeamsCellDelegate {
    func deleteCell() {
        self.teamsTable.reloadData()
        self.plusBtnShow()
    }
}

您可以在 loading/setting 上一个单元格时调用 deleteButtonShowHide 函数:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "TeamsCell") as? TeamsCell {
        cell.updateCell(team: teams[indexPath.row])
        cell.deleteButtonShowHide()  // <-- HERE
        cell.teamsCellDelegate = self
        return cell
    }
    return UITableViewCell()
}

顺便说一下,您的单元格首先不应包含此类逻辑。它应该取决于一些数据模型对象,然后应该使用这些对象正确设置您的单元格(show/hide UI 元素等)。

你可以在计算行数时通过设置按钮show/hide来简化。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if teams.count < 5 {plusBtn.isHidden = false}
    if teams.count == 4 { plusBtn.isHidden = true}
    return teams.count
}

并在创建单元格时设置删除按钮可见性:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "TeamsCell") as? TeamsCell {
        cell.updateCell(team: teams[indexPath.row])
        // cell.teamsCellDelegate = self
        cell.deleteButton.isHidden = (teams.count < 3)
        return cell
    }
    return UITableViewCell()
}

所以不需要代表和单元不需要知道模型(团队)