我有一个可扩展的tableView。 headerCell有一个checkBox,一个标签和一个radioButton。 collapsableCell有一个复选框和一个标签。
我使用 M13Checkbox 库来实现checkBox和radioButton。
问题是当我在索引0处选择一个radioButton或HeaderViewCell的复选框时,也会选择索引 8,16,24 的radioButton / checkBox。我知道这是因为tableView属性中的numberOfSections,但是我如何一次只选择一个单一的radioButton。 我的要求是我必须在tableView中选择单个radioButton,而CheckBoxes可以为HeaderCell提供多个选择。
我严重困扰这个问题。我google了很多但没有任何效果。任何帮助或建议非常感谢。
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…??
}
}
答案 0 :(得分:0)
TableViews在保存数据时很棘手,而不知道可以在某种对象类中保存的某种保存状态是否可以做一些奇怪的事情,例如重用单元格;选择不正确的单元格。我猜你已经为你的州和城市创造了某种对象。我确保他们不是类,而不是结构,并确保他们有某种isTapped Bool
,因此您可以实际保存该单个对象的状态,如下所示:
class CellObject: NSObject {
var isTapped: Bool
init(isTapped: Bool) {
self.isTapped = isTapped
}
}
不要只在你的didSelect
方法中将isSelected设置为true或false,而是将THAT单元格对象isTapped
设置为true或false AS WELL将状态更改为您想要的任何内容,即更改它&# 39;将背景颜色变为黑色以显示它已被选中。在cellForRowAtIndexPath方法中加载单元格时,检查单元格对象isTapped
是否为true,并相应地设置它的状态,颜色等。这是这个想法的准系统,但我希望这能指出你正确的方向。