在可重用单元格内操作标签?

时间:2015-08-14 12:55:04

标签: ios swift uitableview uibutton

在SO的帮助下,我设法为单元格内的按钮提供了这种方法。

的cellForRowAtIndexPath

    let cell = tableView.dequeueReusableCellWithIdentifier("buildCell", forIndexPath: indexPath) as! UITableViewCell

    let mapsbut = cell.viewWithTag(912) as! UIButton
    mapsbut.tag = indexPath.row
    mapsbut.addTarget(self, action: "mapsHit:", forControlEvents: UIControlEvents.TouchUpInside)

    return cell

的ViewController

func mapsHit(sender: UIButton!){

    passBuild = buildings[sender.tag]
    performSegueWithIdentifier("mapSegue2", sender: self)

}

现在发生的事情是当我滚动表格视图时,我在行上遇到致命错误:

let mapsbut = cell.viewWithTag(912) as! UIButton

带有消息:unexpectedly found nil while unwrapping an Optional value

所以,正在发生的事情是,视图标签在函数内部发生了变化,当我尝试在下一个单元格中引用它时,912已被更改。

为了解决这个问题,我在mapsHit函数

的末尾添加了这行代码
sender.tag = 912

但现在我需要以下条件:

if the button isn't clicked, change tag to 912

这似乎不太可能。

有解决方法吗?

1 个答案:

答案 0 :(得分:1)

像这样设置自定义单元格:

<强> buildingCell

class buildingCell: UITableViewCell {

    @IBOutlet weak var mapsbut: UIButton!

}

<强>的cellForRowAtIndexPath

    let cell = tableView.dequeueReusableCellWithIdentifier("buildCell", forIndexPath: indexPath) as! buildingCell

    cell.mapsbut.tag = indexPath.row
    cell.mapsbut.addTarget(self, action: "mapsHit:", forControlEvents: UIControlEvents.TouchUpInside)

    return cell

并保持mapsHit功能完全相同。

这样您就不必担心初始引用的标记,因此您不会遇到任何错误!