【发布时间】:2016-12-06 18:01:03
【问题描述】:
我的初始视图控制器中的属性是在调用 AppDelegate 函数 didFinishLaunchingWithOptions 之前还是之后设置的?
这是 AppDelegate 中的代码。当我的应用第一次启动时,如果“CurrentDateBool”的用户默认值尚未设置,它会设置为 true。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if UserDefaults.standard.value(forKey: "currentDateBool") == nil {
UserDefaults.standard.setValue(true, forKey: "currentDateBool")
}
return true
}
这是我的初始视图控制器。这会使我的应用程序在 currentDateBool 属性上崩溃,因为它是 nil。但是,它不应为 nil,因为它在 AppDelegate 中将其设置为 true。我认为 AppDelegate 在初始视图控制器之前设置。有人可以澄清设置属性的顺序吗?
class TimestampTableViewController: UITableViewController {
var currentDateBool = UserDefaults.standard.value(forKey: "currentDateBool") as! Bool
override func viewDidLoad() {
super.viewDidLoad()
}
...
}
如果我在 viewDidLoad 中将 currentDateBool 属性设置为用户默认值,我可以让它工作。
class TimestampTableViewController: UITableViewController {
var currentDateBool = true
override func viewDidLoad() {
super.viewDidLoad()
currentDateBool = UserDefaults.standard.value(forKey: "currentDateBool") as! Bool
}
...
}
【问题讨论】:
-
"如果我在 viewDidLoad 中将 currentDateBool 属性设置为用户默认值,我可以让它工作。"那就这样做吧!
-
@matt 我做到了!哈哈。我只是想了解为什么当我不这样做时它会崩溃。我认为 AppDelegate 在我的属性设置之前被调用,所以我不明白它为什么会崩溃。
-
TimestampTableViewController 是你的根视图控制器吗?您使用的是主情节提要吗?
-
@matt 是的,这是我的根视图控制器,我正在使用主故事板