tableView中的按钮addTarget

时间:2016-10-29 19:34:44

标签: ios swift uitableview swift3

我正在尝试为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 :),但它不会改变功能。

1 个答案:

答案 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中找到有关类似问题的更多详细信息。