我需要用户只能从单元格中选择一个值。
@objc func switchChangedPeriod(_ sender : UISwitch!){
if sender.isOn{
periodUserString = period[sender.tag].periodUser
periodSystemString = period[sender.tag].periodSystem
//sender.setOn(false, animated: true) how to set OFF all switches except current
}else{
periodUserString = ""
periodSystemString = ""
}
}
或者也许我只需要将先前的UISwitch设置为OFF?
答案 0 :(得分:0)
首先为您的delegate
子类创建UITableViewCell
,并在更改其值时声明switch的功能。
protocol CellDelegate {
func switchChangedValue(_ value: Bool, period: Period)
}
现在在子类内部创建delegate
和period
变量,并在更改其值时为开关创建IBAction
class YourCell: UITableViewCell {
var delegate: CellDelegate?
var period: Period?
...
@IBAction func switchChanged(_ sender: UISwitch) {
delegate?.switchChangedValue(sender.isOn, period: period!)
}
}
接下来让我们为控制器中的选定Period
创建全局变量
var selectedPeriod: Period?
现在将您的委托实施为ViewController
并将periodUserString
和periodSystemString
设置为正确的格式,并且如果值是true
则将selectedPeriod
设置为{{1} },如果开关已关闭,请将其设置为period
。最后,重新加载TableView数据
nil
...在这里,您应该考虑是否需要在拥有class ViewController: UIViewController, CellDelegate {
...
func switchChangedValue(_ value: Bool, period: Period) {
periodUserString = value ? period.periodUser : ""
periodSystemString = value ? period.periodSystem : ""
selectedPeriod = value ? period : nil
tableView.reloadData()
}
}
变量时设置periodUserString
和periodSystemString
{{1}中是否设置了selectedPeriod
状态取决于UISwitch
是否等于索引中等于cellForRowAt
的数组中的某些selectedPeriod
(请注意,现在您的period
类/结构必须是 codable )。同样不要忘记设置单元格的indexPath.row
和Period
。
delegate