ios - 从 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()
}
}
解决方案
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 元素等)。
推荐阅读
- c - Windows 10下C程序无法连接SQLite
- android - Metal 和所有其他 c++ 平台共有哪些 c++ 数据类型
- python - 带 wtforms 的反向数字猜测烧瓶
- raspberry-pi - 我们可以使用树莓派从磨损操作系统中读取心跳数据吗
- python - 不重复的变化
- spring - 未调用 RefreshScopeRefreshedEvent 侦听器
- mysql - 用于在括号开始和结束组中分组日期的Sql查询
- swift - 使用 Alamofire 下载失败,应用程序终止
- php - 替换字符串的最后一个字符
- vb.net - 如何使用 VLCActiveXPlugin_V2 将 VLC 合并到我的 VB 编程中