【问题标题】:Update View every day每天更新视图
【发布时间】:2025-12-14 04:20:07
【问题描述】:

寻找每天更新视图的可能性。

这是我尝试过的......但它甚至不打印“test2”

var WordNumber = 0
override func viewDidLoad() {
    super.viewDidLoad()
    let userDefault = UserDefaults.standard
    if let lastRe = userDefault.dictionary(forKey: "lastRe") {
        print("test2")
        if let letztesDatum = lastRe ["date"] as? NSDate {
            print("test3")
            if let index = lastRe ["index"] as? Int {
                print("test4")
                if abs(letztesDatum.timeIntervalSinceNow) > 1 {
                    print("test5")
                    WordNumber = index + 1
                    let  _ : [NSObject : AnyObject] = ["date" as NSObject : NSDate(),
                                                       "index" as NSObject : WordNumber as AnyObject]
                }
                print("test6")
                nextDay() //update lbl
                userDefault.set(lastRe, forKey: "lastRe")
                userDefault.synchronize()
            }
        }
    }
}

【问题讨论】:

  • 请记住,首次安装应用程序时,UserDefaults 将没有任何值。因此,如果您的代码只在代码中添加一个值来检查它是否有值,那么它永远不会有值。
  • 顺便说一句 - synchronize() 已过时。不要使用它。
  • 只是建议兄弟,如果允许,永远不要使用金字塔。这将导致您更加复杂。是的,关于您的打印问题,我认为@rmaddy 是对的(兄弟+1 投票)

标签: swift userdefaults


【解决方案1】:

更简单的解决方案:仅保存日期整数并添加观察者以在日期更改时收到通知

override func viewDidLoad() {
    super.viewDidLoad()
    let today = Calendar.current.component(.day, from: Date())
    let lastRe =  UserDefaults.standard.integer(forKey: "lastRe")
    if today != lastRe {
        updateView(day: today)
    }
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(forName: .NSCalendarDayChanged, object:nil, queue: .main) { [weak self] _ in 
       let today = Calendar.current.component(.day, from: Date())
       self?.updateView(day: today)
    }
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    NotificationCenter.default.removeObserver(self, name:.NSCalendarDayChanged, object:nil)
}

func updateView(day : Int) {
    nextDay()
    UserDefaults.standard.set(day, forKey: "lastRe")
}

【讨论】:

  • 谢谢!效果很好。是否有机会每天在不同的手机上显示相同的视图?这不适用于 UserDefault 对吗?
  • 不是在其他手机上,为此您需要像 CloudKit 这样的同步服务。
【解决方案2】:

if let lastRe = userDefault.dictionary(forKey: "lastRe")

上面的代码只有在找到值的情况下才会执行该块。您没有在 UserDefaults 中为键 lastRe 设置默认值,因此代码永远不会执行。

尝试设置默认值:

UserDefaults.Standard.set("my initial value here", forKey: "lastRe")

【讨论】:

  • 您不想使用此解决方案。它将清除以后写入的任何值。