Используйте делегат, чтобы показать / скрыть ячейку таблицы - PullRequest
1 голос
/ 24 марта 2019

У меня есть tableview с тремя рядами. Во втором ряду есть переключатель UIS, который, когда он выключен, третий ряд должен быть скрыт, а когда он включен, он будет показан.

Я использую делегат для этого: вот протокол:

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 голосов
/ 24 марта 2019

(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?
...