允许在 table 视图中仅选择一个选项开关按钮
Allows to choose only one option switch button inside table view
验证状态切换的最佳或优雅方法是什么?
例如,如果我select第二个选项(NO),改变第一个选项状态(isOn到false)(SI)
我想实现只允许选择一个选项
我在 table 视图中有这个开关
extension QuestionListTableViewCell: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return answers.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "answerListCell", for: indexPath) as! AnswerListTableViewCell
cell.separatorInset.right = cell.separatorInset.left
cell.answerList.optionSwitch.tag = indexPath.row
cell.answerList.optionSwitch.addTarget(self, action: #selector(self.switchChanged(_:)), for: .valueChanged)
return cell
}
@objc func switchChanged(_ sender: UISwitch!){
print("Table row switch Changed \(sender.tag)")
print("The switch is \(sender.isOn ? "ON" : "OFF")")
}
}
我从 xib 加载视图
class AnswerList: UIView {
@IBOutlet weak var optionSwitch: UISwitch!
@IBOutlet weak var optionLabel: UILabel!
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
func commonInit(){
let viewFromXib = Bundle.main.loadNibNamed("AnswerList", owner: self, options: nil)![0] as! UIView
viewFromXib.frame = self.bounds
addSubview(viewFromXib)
}
@IBAction func switchChangedState(_ sender: UISwitch) {
}
}
您可能希望在视图控制器中添加一个 属性 来跟踪所选开关
var selectedSwitchIndex: Int?
然后在您的 cellForRowAt
方法中,将所选开关设置为打开并保持其他开关关闭。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "answerListCell", for: indexPath) as! AnswerListTableViewCell
cell.separatorInset.right = cell.separatorInset.left
cell.answerList.optionSwitch.tag = indexPath.row
cell.answerList.optionSwitch.addTarget(self, action: #selector(self.switchChanged(_:)), for: .valueChanged)
let isSelected = indexPath.row == selectedSwitchIndex
cell.answerList.optionSwitch.isOn = isSelected
return cell
然后在您的 switchChanged
方法中,将 selectedSwitchIndex
属性 设置为切换已切换的索引并重新加载您的 table 视图。
@objc func switchChanged(_ sender: UISwitch!){
// you would want to save the index only when its set to on
guard sender.isOn else {
// setting the selectedSwitchIndex to nil if the switch is turned off
selectedSwitchIndex = nil
return
}
selectedSwitchIndex = sender.tag
tableView.reloadData()
}
验证状态切换的最佳或优雅方法是什么?
例如,如果我select第二个选项(NO),改变第一个选项状态(isOn到false)(SI)
我想实现只允许选择一个选项
我在 table 视图中有这个开关
extension QuestionListTableViewCell: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return answers.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "answerListCell", for: indexPath) as! AnswerListTableViewCell
cell.separatorInset.right = cell.separatorInset.left
cell.answerList.optionSwitch.tag = indexPath.row
cell.answerList.optionSwitch.addTarget(self, action: #selector(self.switchChanged(_:)), for: .valueChanged)
return cell
}
@objc func switchChanged(_ sender: UISwitch!){
print("Table row switch Changed \(sender.tag)")
print("The switch is \(sender.isOn ? "ON" : "OFF")")
}
}
我从 xib 加载视图
class AnswerList: UIView {
@IBOutlet weak var optionSwitch: UISwitch!
@IBOutlet weak var optionLabel: UILabel!
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
func commonInit(){
let viewFromXib = Bundle.main.loadNibNamed("AnswerList", owner: self, options: nil)![0] as! UIView
viewFromXib.frame = self.bounds
addSubview(viewFromXib)
}
@IBAction func switchChangedState(_ sender: UISwitch) {
}
}
您可能希望在视图控制器中添加一个 属性 来跟踪所选开关
var selectedSwitchIndex: Int?
然后在您的 cellForRowAt
方法中,将所选开关设置为打开并保持其他开关关闭。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "answerListCell", for: indexPath) as! AnswerListTableViewCell
cell.separatorInset.right = cell.separatorInset.left
cell.answerList.optionSwitch.tag = indexPath.row
cell.answerList.optionSwitch.addTarget(self, action: #selector(self.switchChanged(_:)), for: .valueChanged)
let isSelected = indexPath.row == selectedSwitchIndex
cell.answerList.optionSwitch.isOn = isSelected
return cell
然后在您的 switchChanged
方法中,将 selectedSwitchIndex
属性 设置为切换已切换的索引并重新加载您的 table 视图。
@objc func switchChanged(_ sender: UISwitch!){
// you would want to save the index only when its set to on
guard sender.isOn else {
// setting the selectedSwitchIndex to nil if the switch is turned off
selectedSwitchIndex = nil
return
}
selectedSwitchIndex = sender.tag
tableView.reloadData()
}