当我尝试获取indexpath.row时,编译器抱怨单元格是nil当按下单元格

时间:2018-02-08 14:29:54

标签: ios swift uitableview cell

这是我的代码。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell: CellAvailableJobs = self.tblJobs.dequeueReusableCell(withIdentifier: "CellAvailableJobs") as! CellAvailableJobs
    let jobsNearByObj:JobsNearBy = self.jobsArray![indexPath.row]
    cell.loadCell(jobsNearByObj: jobsNearByObj)
    cell.btnHeart.addTarget(self, action: #selector(JobsVC.btnBookmarkAction), for: .touchUpInside)
    cell.btnHeart.tag = indexPath.row
    return cell
}

@IBAction func btnBookmarkAction(_ sender: AnyObject){
    let button = sender as? UIButton
    print("tag: \(String(describing: button?.tag))")
    let cell = button?.superview?.superview as? UITableViewCell
    let indexPath = tblJobs.indexPath(for: cell!)
    print("bookmarkedJobId: \(String(describing: indexPath.row))")
}

我从网上获取数据并在tableview上填充它们,一切运行良好。我想在点击单元格上的按钮时打印indexpath.row。在上面的方法中,编译器抱怨单元格为零。这一行:让indexPath = tblJobs.indexPath(for:cell!)。

此代码有什么问题。在此代码中单元格如何为零。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

问题是当单元格当前不可见时,它的值为nil,您无法显式展开可选值

let cell = button?.superview?.superview as? UITableViewCell

试试这个

 if(cell != nil)
{
   let indexPath = tblJobs.indexPath(for: cell!)
}

旁边的单元格类型为CellAvailableJobs,您使用as? UITableViewCell

答案 1 :(得分:0)

let cell = button?.superview?.superview as? UITableViewCell似乎无法成为UITableViewCell个实例,因此cellnil

正如你所知,这实际上是你想要的:

let cell = button?.superview?.superview?.superview as? UITableViewCell