【问题标题】:Swift userdefaults not storing valueSwift userdefaults 不存储值
【发布时间】:2021-04-12 15:13:20
【问题描述】:

我试图在 Firestore 中用户的帖子数量为 5 时发出警报。我正在尝试在显示警报时使用 userdefaults 来存储 true,以便在显示视图控制器时它不会继续显示。但是,当我尝试使用此代码进行检查时,它仍然每次都会显示警报,因此我假设用户默认值没有更改为 true。有人知道为什么会这样吗?

 private func checkDueReview(){
    if User.currentUser() != nil {
        let alertShown = UserDefaults.standard.bool(forKey: "ShownAlert")
    
    let currentUser = User.currentUser()!
        
        if alertShown == false && currentUser.numberOfPosts == 5{
                self.present(reviewAlert!, animated: true, completion: nil)
                UserDefaults.standard.set(true, forKey: "ShownAlert")
        }else {
            UserDefaults.standard.set(false, forKey: "ShownAlert")
        }
    }
   
}

【问题讨论】:

  • 如果 alertShown 曾经为真,则将其重置为假,如果他们仍有 5 个帖子,则再次显示。
  • 您是否检查了用户的帖子数,而不是假设 UserDefaults 值没有变化?

标签: swift google-cloud-firestore nsuserdefaults


【解决方案1】:

问题在于您执行 2 次检查的第二个 if 条件,但 else 仅对第二个有效,currentUser.numberOfPosts == 5(您的意思是 >= 5 btw?)

所以我会改成

if currentUser.numberOfPosts == 5 {
    if alertShown == false {
        self.present(reviewAlert!, animated: true, completion: nil)
        UserDefaults.standard.set(true, forKey: "ShownAlert")
    }
} else {
    UserDefaults.standard.set(false, forKey: "ShownAlert")
} 

还可以对您的代码进行一些其他改进,例如将第一个 if 替换为 guard 语句,并在检查错误时使用 !

guard let currentUser = User.currentUser() else { return }
let alertShown = UserDefaults.standard.bool(forKey: "ShownAlert")

if currentUser.numberOfPosts == 5 {
    if !alertShown {
        self.present(reviewAlert!, animated: true, completion: nil)
        UserDefaults.standard.set(true, forKey: "ShownAlert")
    }
} else {
    UserDefaults.standard.set(false, forKey: "ShownAlert")
}

【讨论】:

  • 嗨,谢谢现在似乎可以工作了,我还需要其他吗?
  • 我摆脱了 else,它现在似乎可以工作了
  • 视情况而定,发帖数能减少吗?如果没有,那么else 可能不需要
猜你喜欢
  • 2017-05-09
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
相关资源
最近更新 更多