Swift 每天更新视图

Swift 每天更新视图,swift,userdefaults,Swift,Userdefaults,寻找每天更新视图的可能性 这就是我尝试过的。。。但它甚至没有打印test2 var WordNumber = 0 override func viewDidLoad() { super.viewDidLoad() let userDefault = UserDefaults.standard if let lastRe = userDefault.dictionary(forKey: "lastRe") { print("test2") i

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

这就是我尝试过的。。。但它甚至没有打印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()
            }
        }
    }
}
如果让lastRe=userDefault.dictionaryWorkey:lastRe

只有在找到值时,上述命令才会执行该块。您没有在UserDefaults中为key lastRe设置默认值,因此代码永远不会执行

尝试设置默认值:


UserDefaults.Standard.setmy initial value here,forKey:lastRe

更简单的解决方案:仅保存日整数,并添加一个观察者,以便在日变化时收到通知

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")
}

请记住,首次安装应用程序时,UserDefaults将没有值。因此,如果您的代码只在检查是否有值的代码中添加一个值,那么它将永远不会有值。顺便说一句,synchronize是过时的。不要用它,只要建议你永远不要使用金字塔。这将使您变得更加复杂。是的,关于你的打印问题,我认为@rmaddy是正确的+1票给你,你不想使用这个解决方案。它将清除以后写入的任何值。谢谢!这很有效。是否有机会每天在不同的手机上显示相同的视图?这不适用于UserDefault,对吗?不适用于其他手机,为此,您需要像CloudKit这样的同步服务。