Swift - выберите один RadioButton в tableView

У меня есть tableView, который можно расширить. HeaderCell имеет checkBox, метку и radioButton. CollapsableCell имеет флажок и метку.

Я использовал библиотеку M13Checkbox для реализации checkBox и radioButton.

Проблема в том, что когда я выбираю RadioButton или checkBox HeaderViewCell с индексом 0, тогда также выбирается radioButton / checkBox с индексом 8,16,24. Я знаю, что это из-за свойства numberOfSections в свойстве tableView, но тогда как мне выбрать только один radioButton за раз. Мое требование: я должен выбрать один RadioButton в tableView, а CheckBoxes может иметь несколько вариантов выбора для HeaderCell.

Я сильно застрял в этом вопросе. Я много гуглил, но ничего не работало. Любая помощь или предложение очень ценится.

func numberOfSections(in tableView: UITableView) -> Int {
    return states.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return states[section].cities.count
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 50.0
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if (states[indexPath.section].expanded) {
        return 44
    }else{
        return 0.0
    }
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerCell = tableView.dequeueReusableHeaderFooterView(withIdentifier: "headerviewcell") as! HeaderView
    var list = states[section]
    headerCell.customInit(titleLabel: list.stateName, section: section, delegate: self)
    return headerCell
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "subcells") as! CollapsibleCell
    cell.selectionStyle = .none   
    cell.textLabel?.text = states[indexPath.section].cities[indexPath.row]
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            // works for headers or cell??
}

func toggleHeader(header : HeaderView, section : Int){
    states[section].expanded = !states[section].expanded

    tableView.beginUpdates()
    for i in 0 ..< states[section].cites.count {
        tableView.reloadRows(at: [IndexPath(row: i, section: section)], with: .automatic)
    }
    tableView.endUpdates()
}

ОБНОВЛЕНИЕ: вот мой код для HeaderView. Всякий раз, когда я выбираю какой-либо radioButton, также выбирается любой случайный radioButton для других разделов. При прокрутке меняется состояние и раздел RadioButtons. Пожалуйста, помогите мне решить эту проблему. Я знаю, что это связано со свойством повторного использования ячеек, но я не могу решить эту проблему.

import UIKit
import M13Checkbox

protocol HeaderViewDelegate {
    func toggleHeader(header : HeaderView, section : Int)
}

protocol CustomHeaderDelegate: class {
    func didTapButton(in section: Int, headerView : HeaderView, button : M13Checkbox)  
}

class HeaderView: UITableViewHeaderFooterView {

@IBOutlet weak var stateCheckBox: M13Checkbox!    
@IBOutlet weak var stateNameLabel: UILabel!
@IBOutlet weak var favouriteState: M13Checkbox!

var delegate : HeaderViewDelegate?
weak var delegateHeader: CustomHeaderDelegate?   
var sectionNumber : Int!
var section : Int!

override func awakeFromNib() {
    stateCheckBox.boxType = .square
    stateCheckBox = .bounce(.fill)

    favouriteState.boxType = .circle
    favouriteState.setMarkType(markType: .radio, animated: true)
    favouriteState.stateChangeAnimation = .bounce(.stroke)
}

override init(reuseIdentifier: String?) {
    super.init(reuseIdentifier: reuseIdentifier)
    self.addGestureRecognizer(UITapGestureRecognizer(target : self, action: #selector(selectHeaderView)))
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder : aDecoder)
    self.addGestureRecognizer(UITapGestureRecognizer(target : self, action: #selector(selectHeaderView)))
}

func selectHeaderView(gesture : UITapGestureRecognizer) {
    let cell = gesture.view as! HeaderView
    delegate?.toggleHeader(header: self, section: cell.section)
}

func customInit(titleLabel : String, section : Int, delegate : HeaderViewDelegate) {
    self.stateNameLabel.text = titleLabel
    self.section = section
    self.delegate = delegate
}

@IBAction func selectPrimaryCondition(_ sender: M13Checkbox) {
    // get section when favourite state radioButton is selected
    delegateHeader?.didTapButton(in: sectionNumber, headerView : self, button : sender)
}

 override func prepareForReuse() {
    // What do do here…??
} 
}

person Bella    schedule 13.03.2018    source источник
comment
Это связано с повторным использованием ячейки tableview, вы также должны проверить это условие в cellForRowAtIndexPath, если selectIndexPath.row == indexPath.row {subCell.checkBox.isSelected = true} else {subCell.checkBox.isSelected = false}   -  person Austin Michael    schedule 13.03.2018
comment
Привет, @AustinMichael. cellForRowAt indexPath реализует мои расширяемые / складывающиеся ячейки. как мне проверить условие для HeaderView, так как я должен выбирать только один radioButton за раз.   -  person Bella    schedule 13.03.2018
comment
Если это Headerview, сделайте это в viewForHeaderInSection   -  person Austin Michael    schedule 13.03.2018
comment
@AustinMichael: Да, я понял это, но что мне нужно проверить. Раньше я также пытался проверить viewForHeaderInSection, но все равно безрезультатно. Он по-прежнему выбирает несколько переключателей, а также выбираются переключатели в других разделах. Я действительно не понимаю этого.   -  person Bella    schedule 13.03.2018
comment
Что меня смущает: в tableView:didSelectRowAt: вы сначала назначаете self.selectIndexPath = indexPath, а затем проверяете if selectIndexPath.row == indexPath.row - но так должно быть всегда, потому что вы просто присвоили ему одно и то же значение.   -  person Andreas Oetjen    schedule 13.03.2018
comment
@AndreasOetjen Извините за поздний ответ. Можете ли вы помочь мне решить первую проблему. С помощью метода prepareForReuse (). Почему выбирается несколько разделов? Как решить эту основную проблему я много пробовал .. :(   -  person Bella    schedule 19.03.2018
comment
@Bella Было бы полезно, если бы вы могли предоставить небольшой компилируемый + запускаемый проект Xcode (загруженный на github или где-то еще), который просто показывает вашу проблему.   -  person Andreas Oetjen    schedule 19.03.2018
comment
@AndreasOetjen: Извините, мне не удалось загрузить проект из-за некоторых ограничений. Моя проблема в том, что когда я выбираю radioButton в headerCell с индексом 0, сначала выбираются radioButton в разделе 8, 16, а когда я прокручиваю tableView, выбирается radioButton в любом случайном разделе. Пожалуйста помоги   -  person Bella    schedule 21.03.2018


Ответы (1)


TableView сложно сохранять данные, не зная о каком-то сохраненном состоянии, которое может храниться в каком-то классе объектов, поскольку он может делать некоторые странные вещи, такие как повторное использование ячеек; выбор неправильных ячеек в вашем случае. Я предполагаю, что вы создали какой-то объект для своих штатов и городов. Я бы убедился, что это классы, а не структуры, и что у них есть какой-то isTapped Bool, чтобы вы могли действительно сохранить состояние для этого отдельного объекта следующим образом:

class CellObject: NSObject {

    var isTapped: Bool

    init(isTapped: Bool) {
        self.isTapped = isTapped
    }
}

Вместо того, чтобы просто устанавливать для вашего isSelected значение true или false внутри вашего didSelect метода, установите для объекта THAT cells isTapped значение true или false ТАКЖЕ, как изменение состояния на все, что вы хотите, т.е. измените цвет фона на черный, чтобы показать, что он выбран. При загрузке ячейки в метод cellForRowAtIndexPath проверьте, является ли объект ячейки isTapped истинным или ложным, и установите его состояние, цвета и т. Д. Соответственно. Это основная идея, но я надеюсь, что она укажет вам правильное направление.

person Daniel Dramond    schedule 13.03.2018
comment
Я использовал struct для штатов и городов. - person Bella; 14.03.2018