首页 > 解决方案 > 从 ViewController Swift 中的 UITableViewCell 调用函数

问题描述

当plusBtnTapped时,我需要从 TeamsVC 调用位于 TeamsCell 中的函数deleteButtonShowHide。我正在尝试使用协议 TeamsVCDelegate来解决它,但它不起作用(它对我来说反之亦然。但我不知道如何实现类似cell.teamsCellDelegate = self

团队细胞

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

团队VC

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

标签: iosswiftuitableview

解决方案


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

顺便说一句,您的单元格首先不应该包含这样的逻辑。它应该取决于一些数据模型对象,然后应该使用这些数据模型对象来正确设置您的单元格(显示/隐藏 UI 元素等)。


推荐阅读