UITableViewCell не обновляет UISwitch при выборе строки - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть UITableViewCell, который содержит кучу UISwitches. Я хочу, чтобы переключатель включался / выключался в зависимости от того, какую строку выбирает пользователь, данные передаются в мою ячейку, но состояние переключателя не обновляется.

Я использую базовый MVC, Storyboard имеет TableView> TableViewCell> Метка |UISwitch

Контроллер:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource  {

var testList = [1,2,3,4,5]
@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    table.tableFooterView = UIView()
    table.delegate = self
    table.dataSource = self
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return testList.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseCell") as! SwitchCell
    //Turn them all on at start
    cell.setSwitch(rowSelected: true)
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseCell") as! SwitchCell
    cell.setSwitch(rowSelected: false)
}

}

SwitchCell

class SwitchCell: UITableViewCell {

@IBOutlet weak var uiswitch: UISwitch!
@IBOutlet weak var label: UILabel!

func setCell(number: Int){
    label.text = String(number)
}

func setSwitch(rowSelected:Bool) {
    uiswitch.setOn(rowSelected, animated: true)
}

}

Я знаю, что могу просто сделать UISwitch неразрешимым, ноЯ смотрю на изменение его состояния, когда пользователь выбирает строку.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseCell") as! SwitchCell
    cell.setSwitch(rowSelected: false)
}

неверно. Используя этот код, вы не выбираете нужную ячейку.

Вы должны сделать что-то вроде этого:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    let cell = tableView.cellForRow(at: indexPath) as! SwitchCell
    cell.setSwitch(rowSelected: false)
}
2 голосов
/ 07 ноября 2019

Прежде всего, мы не снимаем с очереди метод cell in didSelectRowAt. Никогда не делай этого. Это приведет к удалению из очереди новой ячейки и не будет отражать какие-либо изменения, которые вы вносите в нее.

Поэтому удалите код для метода tableView(_: didSelectRowAt:).

Во-вторых, вы можете просто обработать UISwitch состояние на основе выбора ячейки в определении SwitchCell's с использованием метода setSelected(_:animate:), например,

class SwitchCell: UITableViewCell {
    @IBOutlet weak var uiswitch: UISwitch!

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        uiswitch.setOn(selected, animated: true)
    }

    //rest of the code...
}

Чтобы избежать громоздкого кода, сделайте всю компоновку cell в пользовательском cell вместо того, чтобы делать это методами delegate или dataSource. Это только сделает вас на 1020 * тяжелее и немодульным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...