如何在Swift中从AppDelegate中的其他类访问数组?

时间:2018-07-13 22:36:00

标签: ios swift class appdelegate

我在名为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类访问两个数组会返回空列表,即使这两个数组都不为空(其他类会看到它们具有的所有值)。参见上面的代码。抱歉,如果这是重复的帖子。

1 个答案:

答案 0 :(得分:2)

简单地说,您不要从AppDelegate类中执行此操作。您可以从数据实际所在的类中进行操作。在HomeController中,从UIApplication注册适当的通知(例如,应用程序正在后台运行),然后对其进行响应。

顺便说一句,该通知应该applicationWillTerminate,因为它永远不会被调用。

(出现这种现象的实际原因是AppDelegate中的Anacii()是错误的对象。但是最好以正确的方式进行操作。)