在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'
答案 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)
确保所有插座连接正确完成,如果没有取下连接并再次创建插座。
我希望这可能有所帮助。