我有一个三行的tableview
,在第二行中有UISwitch,当它关闭时,第三行应该被隐藏,而当它打开时,它将被显示。
我为此使用委托: 这是协议:
protocol ChangeStatusOFSwitchBtnDelegate {
func toggle(isOn: Bool)
}
这是UITableViewCell
@IBOutlet weak var deadlineSwitchState: UISwitch!
func configure(swicthIsOn: Bool, delegate: ChangeStatusOFSwitchBtnDelegate) {
deadlineSwitchState.isOn = swicthIsOn
self.switchBtnDelegate = delegate
}
@IBAction func changeStateToggle(_ sender: UISwitch) {
if deadlineSwitchState.isOn == true {
switchBtnDelegate!.toggle(isOn:true)
} else {
switchBtnDelegate!.toggle(isOn:false)
}
}
var switchBtnDelegate: ChangeStatusOFSwitchBtnDelegate?
这是UIViewController
class AddListPopup: UIViewController, UITableViewDelegate, UITableViewDataSource, ChangeStatusOFSwitchBtnDelegate {
// Delegate
private var switchBtnIsOn = false
func toggle(isOn: Bool) {
self.switchBtnIsOn = isOn
NewListDetailsTableView.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return (taskCellArray.count - 1 ) + (switchBtnIsOn ? 1 : 0)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
indexPath.row == 1 {
let switchCell = tableView.dequeueReusableCell(withIdentifier: "switch cell", for: indexPath) as! NewListPopupViewCell
switchCell.configure(swicthIsOn: switchBtnIsOn, delegate: self) //Set delegate here
return switchCell
}
return UITableViewCell()
}
问题是:
我会在这里得到两个错误:
首先,如果我用与您在此处看到的代码相同的方式在switchBtnDelegate
中解包UITableViewCell
,则会得到:
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
此错误出现在这里:
@IBOutlet weak var deadlineSwitchState: UISwitch!
@IBAction func changeStateToggle(_ sender: UISwitch) {
if deadlineSwitchState.isOn == true {
switchBtnDelegate!.toggle(isOn:true) //The error appears here
} else {
switchBtnDelegate!.toggle(isOn:false)
}
}
var switchBtnDelegate: ChangeStatusOFSwitchBtnDelegate?
如果我使用?使其保持可选:
@IBOutlet weak var deadlineSwitchState: UISwitch!
@IBAction func changeStateToggle(_ sender: UISwitch) {
if deadlineSwitchState.isOn == true {
switchBtnDelegate?.toggle(isOn:true)
} else {
switchBtnDelegate?.toggle(isOn:false)
}
}
var switchBtnDelegate: ChangeStatusOFSwitchBtnDelegate?
我收到此错误:
class AppDelegate: UIResponder, UIApplicationDelegate { Thread 1: signal SIGABRT
有人可以帮我解决问题的根源吗?
非常感谢您
答案 0 :(得分:0)
(1)
未设置您的代表的原因似乎是,因为您在代码if
的第一行中缺少tableView(UITableView, cellForRowAt:IndexPath)
。您原本打算成为if
语句的块中的代码似乎从未运行过。
我会在第一行上添加一个if
,看看它是否在执行您想要的操作。
更新:这还将在控制台中解释消息unrecognized selector sent to instance 0x7fd3a4068800'
,因为您的方法将始终返回UITableViewCell
而不是NewListPopupViewCell
。
(2)
像这样崩溃
class AppDelegate: UIResponder, UIApplicationDelegate { Thread 1: signal SIGABRT
通常发生在以下情况:
1.我正在尝试加载不属于目标的情节提要或
2.我正在尝试使用不在我正在发送消息的控制器上的segue,或者
3.控制器与情节提要中的其他元素之间缺少连接。
因此,我将确保故事板(或xib)中的所有内容均具有适当的连接,然后重试。
(3)
关于委托……您应确保始终使用weak
关键字声明委托,并将它们始终视为可选委托。
weak var delegate: ChangeStatusOFSwitchBtnDelegate?