为什么当控制器出现时我的 Switch 总是关闭?

Why is my Switch always off when the controller is presented?

我用 Eureka 创建了一个 SwitchRow,但我的开关无法保存当前状态。当模态显示 SettingsView 时,它始终显示为关闭。这有点令人恼火,因为我将行值保存到 UserDefaults 并且您无法判断它是否打开。这是我的代码:

class SettingsView : FormViewController{
    override func viewDidLoad() {
        super.viewDidLoad()
    
            +++ Section("Messages")
            <<< SwitchRow("message_people_withId") { row in
                row.title = "Activate messages"
            }.onChange { row in
                row.title = (row.value ?? false) ? "Deactivate messages" : "Activate messages"
                row.updateCell()
                UserDefaults.standard.set(row.value ?? false, forKey: "MessageSettingsRow")

            }

这将创建一个开关,如果用户将其关闭或打开,它会更改标题。但是 ui 的变化没有反映出来。我认为最好的方法是检查开关行本身并根据行值更改其值:

 if row.value == true {
                    (self.form.rowBy(tag: "message_people_withId") as? SwitchRow)?.cell.switchControl.isOn = true
                } else {
                    (self.form.rowBy(tag: "message_people_withId") as? SwitchRow)?.cell.switchControl.isOn = false
                }

但这并没有改变什么。

有什么建议吗?提前致谢。

您需要定义 row.value 因此使您的代码类似于;

class SettingsView : FormViewController{
    override func viewDidLoad() {
        super.viewDidLoad()
    
            +++ Section("Messages")
            <<< SwitchRow("message_people_withId") { row in
                row.title = "Activate messages"
                row.value = UserDefaults.standard.bool(forKey: "MessageSettingsRow")
            }.onChange { row in
                row.title = (row.value ?? false) ? "Deactivate messages" : "Activate messages"
                row.updateCell()
                UserDefaults.standard.set(row.value ?? false, forKey: "MessageSettingsRow")

            }

这将确保 viewDidLoad() 上的值正确。

您的第二个代码块,评估 row.value 为真与否的代码块将始终 return 假,因为 SwitchRow 的标准状态为假。

为简单起见,您的行值未得到更新

 print(row.value)

你每次都是真的所以你的开关总是开着

if row.value == true {
                (self.form.rowBy(tag: "message_people_withId") as? SwitchRow)?.cell.switchControl.isOn = true
            } else {
                (self.form.rowBy(tag: "message_people_withId") as? SwitchRow)?.cell.switchControl.isOn = false
            }