表格单元格中的UIButton“无法识别的选择器发送到实例”

时间:2016-11-25 15:43:56

标签: ios swift swift3

我在表格单元格中有一个按钮,按下它会导致应用程序崩溃并显示错误:

  

无法识别的选择器发送到实例0x7f9a39840a00   2016-11-25 15:32:04.310 App Name [19161:1264937] ***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [App_Name.routineCell forwardPress:]:无法识别的选择器发送到实例0x7f9a39840a00'< / p>

以下是代码:

   internal func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
    return routineGroups.count
}

func cellButtonPress() {
    print("works")
}
internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{

    let cell:routineCell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! routineCell

    cell.textLabel?.text = routineGroups[indexPath.row]

    cell.forwardButton.tag = indexPath.row
    cell.forwardButton.addTarget(self, action: #selector(routinesGroups.cellButtonPress), for: UIControlEvents.touchUpInside)

    return cell
}

我在这里查看了解决方案:Link1Link2但我每次都得到同样的错误。 单元格有自己的.swift文件,它作为插座拖动: Cell.swift file

当崩溃发生时,Xcode将我带到AppDelegate.swift并显示:crash goto

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

似乎问题是关于forwardPress,而不是forwardButton还是cellButtonPress。您是否在Interface Builder中检查了Outlet Inspector?

在某些界面元素(可能是读取调试器时的单元格)上,您可能在名为forwardPress的代码中没有链接的插座。您对元素执行操作,IB查找forwardPress方法,该方法不存在=&gt;崩溃。

答案 1 :(得分:-1)

对于UIButton中的UITableViewCell操作,您可以使用:

方法-1 - 使用关闭,即使在CustomTableViewCell本身也可以轻触按钮。

CustomTableViewCell上课:

class CustomTableViewCell: UITableViewCell
{
    @IBOutlet weak var forwardButton: UIButton!
    var completionHandler : (()->())?

    @IBAction func cellButtonPressed(_ sender: UIButton)
    {
        if let handler = self.completionHandler
        {
            handler()
        }
    }
}

UITableViewDataSource方法:

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
        cell.completionHandler = {[weak self] in self?.cellButtonPress()}
        return cell
    }

方法-2 - 在控制器级别处理按钮点击事件。

UITableViewDataSource方法:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
        cell.forwardButton.addTarget(self, action: #selector(cellButtonPress), for: .touchUpInside)
        return cell
    }