如何在tableview单元格中使用开关?

时间:2018-04-20 03:13:45

标签: ios swift uitableview protocols

在iOS Swift 4.0中,我在tableview单元格中有一个开关。但是,每当我点击它时,它都会以unrecognized selector sent to instance消息崩溃。我还没有找到解决方案。

以下是我一直试图做的事情......

TableView Cell:

import UIKit

protocol PromoCellSubclassDelegate : class {
    func switchValueChanged(sender: UISwitch, cell: PromoCellSubclass)
}

class PromoCellSubclass: UITableViewCell {

    @IBOutlet weak var pageName: UILabel!
    @IBOutlet weak var activeSwitch: UISwitch!

    var delegate: PromoCellSubclassDelegate?

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        self.delegate = nil
    }

    @IBAction func ValueChanged(_ sender: UISwitch) {
        self.delegate?.switchValueChanged(sender: sender, cell: self)
    }
}

父ViewController:

class ProviderPromoViewController: Y2goViewController, UITableViewDelegate, UITableViewDataSource, PromoCellSubclassDelegate {

    @IBOutlet weak var tableView: UITableView!

...

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! PromoCellSubclass

    cell.delegate = self
    cell.pageName.text = promos[(indexPath as NSIndexPath).row].promoName
    cell.setBackground()

    let promoStatus = promos[(indexPath as NSIndexPath).row].statusCd!

    switch promoStatus {
    case 1:
        cell.activeSwitch.isOn = false
    case 2:
        cell.activeSwitch.isOn = true
    default:
        cell.activeSwitch.isOn = false
    }

    return cell
}

...


func switchValueChanged(sender: UISwitch, cell: PromoCellSubclass) {
    guard let indexPath = self.tableView.indexPath(for: cell) else {
        return
    }

    print("Switch changed on row \((indexPath as NSIndexPath).row)")
}

SwitchValueChanged被调用并正常工作,但一旦完成就会崩溃。我错过了什么?

编辑: 完整的错误消息是:

  

2018-04-19 20:55:20.708538-0600 Y2GOsp [74562:15808974]    - [Y2GOsp.PromoCellSubclass switchValueChanged:]:无法识别的选择器发送到实例0x7fd356838000 2018-04-19 20:55:53.253801-0600   Y2GOsp [74562:15808974] ***由于未捕获的异常而终止应用程序   ' NSInvalidArgumentException',原因:' - [Y2GOsp.PromoCellSubclass   switchValueChanged:]:发送到实例的无法识别的选择器   0x7fd356838000'

3 个答案:

答案 0 :(得分:2)

清除您的IBOutlet连接,再次连接它们将起作用;)

答案 1 :(得分:0)

为什么在协议声明中使用此类词,不需要

protocol PromoCellSubclassDelegate : class {
    func switchValueChanged(sender: UISwitch, cell: PromoCellSubclass)
}

这个prepareForReuse是什么,这也不是必需的..

override func prepareForReuse() {
    super.prepareForReuse()
    self.delegate = nil
}

否则所有代码都是正确的......使用Exceptional Breakpoint,调试器将在崩溃的地方停止..

答案 2 :(得分:0)

确保所有插座连接正确完成,如果没有取下连接并再次创建插座。

我希望这可能有所帮助。