如何在 Swift 中的 AppDelegate 中从其他 类 访问数组?
How can I access arrays from other classes inside AppDelegate in Swift?
我在一个名为 Anacii 的 class 中有一个数组,显然还有一个 AppDelegate class。当应用程序终止时,我试图将两个数组都位于 Anacii class 内保存到 UserDefaults
。除了从 AppDelegate class 的 Anacii class 获取两个数组外,一切正常。这两个数组里面都有多个值(我用一些打印语句测试过)我可以从我的根视图控制器访问它们,里面的所有值都很好,但是当我从中获取它们时,它们 return 作为空数组AppDelegate class.
这是 Anacii class 中定义的两个数组:
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 class:
访问变量的地方
@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 底部的两个值 class(anacs 和 rarities)都等于 []
(使用 print 语句测试)。
抱歉,如果这是一个重复的问题,我查看了很多其他类似的 post,但找不到适合我的答案。谢谢!
TL;DR: 你应该阅读整篇文章但是......试图从 AppDelegate class 访问来自 Anacii class 的两个数组returns 空列表,即使这两个数组不为空(其他 classes 看到它们及其所有值)。请参阅上面的代码。抱歉,如果这是重复的 post。
简单地说,您不要 从 AppDelegate class 执行此操作。您可以从数据实际所在的 class 开始。在 HomeController 中,从 UIApplication 注册适当的通知(例如,应用程序正在后台运行)并响应它。
顺便说一下,该通知应该 而不是 applicationWillTerminate
,因为它从未被调用过。
(您所看到的现象的实际原因是 AppDelegate 中的 Anacii()
是错误的对象。但最好以正确的方式执行此操作。)
我在一个名为 Anacii 的 class 中有一个数组,显然还有一个 AppDelegate class。当应用程序终止时,我试图将两个数组都位于 Anacii class 内保存到 UserDefaults
。除了从 AppDelegate class 的 Anacii class 获取两个数组外,一切正常。这两个数组里面都有多个值(我用一些打印语句测试过)我可以从我的根视图控制器访问它们,里面的所有值都很好,但是当我从中获取它们时,它们 return 作为空数组AppDelegate class.
这是 Anacii class 中定义的两个数组:
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 class:
访问变量的地方@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 底部的两个值 class(anacs 和 rarities)都等于 []
(使用 print 语句测试)。
抱歉,如果这是一个重复的问题,我查看了很多其他类似的 post,但找不到适合我的答案。谢谢!
TL;DR: 你应该阅读整篇文章但是......试图从 AppDelegate class 访问来自 Anacii class 的两个数组returns 空列表,即使这两个数组不为空(其他 classes 看到它们及其所有值)。请参阅上面的代码。抱歉,如果这是重复的 post。
简单地说,您不要 从 AppDelegate class 执行此操作。您可以从数据实际所在的 class 开始。在 HomeController 中,从 UIApplication 注册适当的通知(例如,应用程序正在后台运行)并响应它。
顺便说一下,该通知应该 而不是 applicationWillTerminate
,因为它从未被调用过。
(您所看到的现象的实际原因是 AppDelegate 中的 Anacii()
是错误的对象。但最好以正确的方式执行此操作。)