Показать / скрыть ячейку табличного представления с помощью UISwitch - PullRequest
0 голосов
/ 21 марта 2019

Я хочу использовать UISwitch, чтобы показать / скрыть tableViewCell в динамическом табличном представлении.UISwitch определен в классе UITableViewCell.

@IBOutlet weak var switchState: UISwitch!

И в другом файле, который я хочу сказать, если этот переключатель включен, количество строк будет 5, в противном случае оно должно быть 4

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let test = PopupViewCell()
    if test.switchState?.isOn == true {
        detailsTableView.reloadData()
        return 5
    } else {
        return 4
    }
}

Но это не работает, ивсегда читается `return 4. Я также проверяю это:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let test = PopupViewCell()
    if test.switchState.isOn {
        detailsTableView.reloadData()
        return 5
    } else {
        return 4
    }
}

Но я получу эту ошибку:

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

Я не уверен, что мне нужно использовать какую-либо функцию действия передэтот процесс или нет, я буду признателен, если кто-то может помочь мне в этом.

1 Ответ

1 голос
/ 22 марта 2019

Самый удобный способ сделать это с делегатом.Когда ячейка коммутатора обнаруживает событие .valueChanged, она должна передать его делегату.Делегат, в свою очередь, обновляет свою модель отображения или выключения коммутатора, а затем перезагружает tableView.

. Вот пример игровой площадки:

import UIKit
import PlaygroundSupport

protocol SwitchDelegate: class {
    func toggle(isOn: Bool)
}

class SwitchCell: UITableViewCell {
    private lazy var switchControl: UISwitch = {
        let switchControl = UISwitch()
        contentView.addSubview(switchControl)
        switchControl.translatesAutoresizingMaskIntoConstraints = false
        switchControl.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 12).isActive = true
        switchControl.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
        switchControl.addTarget(self, action: #selector(toggleSwitch(_:)), for: .valueChanged)
        return switchControl
    }()
    private weak var delegate: SwitchDelegate?
    override func awakeFromNib() {
        super.awakeFromNib()

    }
    func configure(isOn: Bool, delegate: SwitchDelegate) {
        switchControl.isOn = isOn
        self.delegate = delegate
    }
    @objc private func toggleSwitch(_ sender: UISwitch) {
        delegate?.toggle(isOn: sender.isOn)
    }
}

class ViewController: UITableViewController {
    private let data = (0..<5).map { $0 + 1 }
    private var isOn = true
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: String(describing: UITableViewCell.self))
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count + (isOn ? 1 : 0)
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if isOn && indexPath.row == 0 {
            let switchCell = SwitchCell(style: .default, reuseIdentifier: String(describing: SwitchCell.self))
            switchCell.configure(isOn: isOn, delegate: self)
            return switchCell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: UITableViewCell.self), for: indexPath)
            let dataIndex = indexPath.row - (isOn ? 1 : 0)
            cell.textLabel?.text = String(describing: data[dataIndex])
            return cell
        }
    }
}

extension ViewController: SwitchDelegate {
    func toggle(isOn: Bool) {
        self.isOn = isOn
        tableView.reloadData()
    }
}

PlaygroundPage.current.liveView = ViewController()
...