我在名为Anacii的类中有一个数组,显然还有一个AppDelegate类。我试图在应用程序终止时将两个数组(都位于Anacii类中)保存到UserDefaults
中。除了从AppDelegate类中的Anacii类中获取两个数组之外,其他所有方法都工作正常。这两个数组内部都有多个值(我用一些打印语句进行了测试),我可以从根视图控制器中访问它们中的所有值,但它们在从AppDelegate类中获取时作为空数组返回。
以下是Anacii类中定义的两个数组:
class Anacii {
// MARK: - Anacs / Rarities
var anacs = [String]()
var rarities = [Int]()
...
}
在这里,我可以在根视图控制器中设置实际值:
class HomeController: UITableViewController, CLLocationManagerDelegate {
private let a = Anacii()
...
override func viewDidLoad() {
super.viewDidLoad()
for _ in 1...10 {
collectAnac()
}
...
}
...
// MARK: - Other functions
func collectAnac() {
let rarity = a.generateRarity()
let anac = a.findAnac(rarity: rarity)
a.anacs.append(anac)
a.rarities.append(rarity)
...
}
}
最后,这是我尝试从AppDelegate类访问变量的地方:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
...
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
let a = Anacii()
let anacs = a.anacs // Comes out as []
let rarities = a.rarities // Comes out as []
...
}
}
AppDelegate类底部的两个值(anacs和稀有性)都等于[]
(通过使用print语句进行测试)。
很抱歉,如果这是一个重复的问题,我看了很多其他类似的帖子,但找不到适合我的答案。谢谢!
TL; DR::您应该阅读完整的内容,但是...尝试从AppDelegate类的Anacii类访问两个数组会返回空列表,即使这两个数组都不为空(其他类会看到它们具有的所有值)。参见上面的代码。抱歉,如果这是重复的帖子。
答案 0 :(得分:2)
简单地说,您不要从AppDelegate类中执行此操作。您可以从数据实际所在的类中进行操作。在HomeController中,从UIApplication注册适当的通知(例如,应用程序正在后台运行),然后对其进行响应。
顺便说一句,该通知应该不为applicationWillTerminate
,因为它永远不会被调用。
(出现这种现象的实际原因是AppDelegate中的Anacii()
是错误的对象。但是最好以正确的方式进行操作。)