我正在尝试为tableView中的某些项添加下载按钮。我已经创建了自定义单元格类并添加了标签和按钮插座,一切都在显示信息,甚至按钮都显示它应该在哪里。
我正在尝试添加目标,但它什么也没做。我需要将行索引传递给buttonClicked函数,还是应该在自定义单元格类中创建此函数然后执行某些操作?我想知道这方面的最佳做法。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "PlaylistCell", for: indexPath) as! PlaylistTableViewCell
let playlist = self.playlists?[indexPath.row]
cell.titleLabel.text = playlist?.getTitle()
if (playlist?.isOfflineAvailable())! {
cell.downloadButton.isHidden = false
} else {
cell.downloadButton.isHidden = true
cell.downloadButton.tag = indexPath.row
cell.downloadButton.addTarget(self, action: #selector(buttonClicked(sender:)), for: .touchUpInside)
}
return cell
}
func buttonClicked(sender: UIButton) {
let buttonRow = sender.tag
print(buttonRow)
}
我也试过从#selector中删除(sender :),但它不会改变功能。
答案 0 :(得分:6)
为了在视图控制器中处理按钮回调,您有两种选择:
:定位动作:强>
正如您在cellForRow
方法中添加目标操作一样。您的代码可能无法正常工作,因为您在隐藏按钮时它应该是可见的,不是吗?
我猜你需要替换这个
if (playlist?.isOfflineAvailable())! {
cell.downloadButton.isHidden = false
} else {
cell.downloadButton.isHidden = true
cell.downloadButton.tag = indexPath.row
cell.downloadButton.addTarget(self, action: #selector(buttonClicked(sender:)), for: .touchUpInside)
}
有了这个:
cell.downloadButton.isHidden = playlist?.isOfflineAvailable()
cell.downloadButton.tag = indexPath.row
cell.downloadButton.addTarget(self, action: #selector(buttonClicked(sender:)), for: .touchUpInside)
你应该每次都更新标签,因为单元格在tableView
中重复使用,如果每次调用cellForRow
时都不这样做,你可以轻松得到一个调用回调的情况,但它是tag属于上一个单元格用法的indexPath。此外,我已将isHidden
逻辑更改为相反的。我猜你应该在isOfflineAvailable
返回true时隐藏按钮,对吗?
委托模式
在SO和其他许多网站上都有数百万次描述。基本上,您定义了一个单元协议,在控制器中实现它,并在按下按钮时从单元格向其委托发送回调。您可以在my answer中找到有关类似问题的更多详细信息。