使用委托显示/隐藏表格视图单元格

时间:2019-03-24 13:30:38

标签: ios swift uitableview delegates

我有一个三行的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

有人可以帮我解决问题的根源吗?

非常感谢您

1 个答案:

答案 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?