我试图在Swift中编写一个简单的待办事项列表,它将列表存储为字符串数组,然后在应用程序加载时从内存中调用它。
我已获得以下代码:
var itemList = [String]()
func loadData() -> [String] {
var arr = [String]()
if NSUserDefaults.standardUserDefaults().objectForKey("storedData") != nil {
arr = NSUserDefaults.standardUserDefaults().objectForKey("storedData")! as! [String]
}
else {
arr = ["Nothing to do..."]
}
return arr
}
func saveData(arr: [String]) {
NSUserDefaults.standardUserDefaults().setObject(arr, forKey: "storedData")
}
我遇到的问题是在哪里调用loadData()。这是一个具有两个视图控制器的应用程序(一个用于列表,一个用于添加项目设置),因此如果我在主视图控制器的viewDidLoad()中放置loadData()调用,则从内存中调用该数组每次切换回主视图控制器时(并覆盖)。
在应用程序启动时,调用它的最佳位置在哪里才能加载一次?
答案 0 :(得分:7)
每次切换回主视图控制器时,都会从内存中调用数组(并重写)。
没有。应用启动时,viewDidLoad
仅加载一次。每次viewcontroller更改时,只会调用viewWillApprear
和viewDidAppear
。
您还可以使用if let
:
if let storedData = NSUserDefaults.standardUserDefaults().objectForKey("storedData") as! [String]{
arr = storedData
}
但是如果您想确保只加载一次,可以将其放在AppDelegate
方法的applicationDidFinishWithOptions
文件中。
但是您必须在AppDelegate
文件中创建一个可以从viewController访问的变量。
答案 1 :(得分:0)
分别使用或覆盖
application(_:didFinishLaunchingWithOptions:)
你的申请代表的。 只在应用程序启动时调用一次。 看到 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/application:didFinishLaunchingWithOptions:
答案 2 :(得分:0)
在首次加载单个控制器的视图后调用viewDidLoad。对于单个viewController的生命周期,不应该多次调用它。也许有可能,如果你不打电话" super.viewDidLoad()"在你自己的viewDidLoad方法中,那么它可能会被再次调用?虽然您通常可以假设应用程序的rootViewController只创建一次,但我认为理论上可能的是,如果需要它可能会被应用程序清除内存,然后再次重新创建 - 所以我永远不会假设它#&# 39; s只调用一次。
你可以做的一件事就是只要加载数据就将boolean(默认值为false)设置为true,如果标志已设置为true,则不再调用它。
或者,将数据管理与viewControllers分开是一个好主意。一个相对简单的解决方案是拥有一个名为" AppData"比方说,这可能是一个单身人士(所以你只能有一个实例)或你的AppDelegate成员。然后,在app delegate" applicationDidFinishLaunchingWithOptions方法中,您可以创建AppData类的一个实例并在其上调用loadData方法。此类将独立于当前显示的任何视图而生存,并且当前视图可以调用此对象上的方法以根据需要加载/保存/更新数据。