【问题标题】:How can I access arrays from other classes inside AppDelegate in Swift?如何在 Swift 中从 AppDelegate 中的其他类访问数组?
【发布时间】:2018-12-22 08:03:49
【问题描述】:

我在一个名为 Anacii 的类中有一个数组,显然还有一个 AppDelegate 类。我试图在应用程序终止时将两个数组保存到 UserDefaults 中,这两个数组都位于 Anacii 类中。除了从 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 和 rarities)都等于 [](使用 print 语句测试)。

对不起,如果这是一个重复的问题,我查看了很多其他类似的帖子,但找不到适合我的答案。谢谢!

TL;DR: 您应该阅读整个内容,但是...尝试从 AppDelegate 类访问 Anacii 类中的两个数组会返回空列表,即使这两个数组不是空的 (其他类看到它们的所有值)。请参阅上面的代码。抱歉,如果这是重复的帖子。

【问题讨论】:

  • 您的数组为空,因为您创建了Anacii 的新实例。
  • @rmaddy 哦,感谢您的澄清。我会在应用加载时尝试创建一个类的实例,看看是否可行。

标签: ios swift class appdelegate


【解决方案1】:

简单地说,您不要从 AppDelegate 类中执行此操作。您可以从数据实际所在的类中执行此操作。在 HomeController 中,从 UIApplication 注册相应的通知(例如应用正在后台处理)并做出响应。

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

(您所看到的现象的实际原因是 AppDelegate 中的 Anacii() 是错误的对象。但最好以正确的方式执行此操作。)

【讨论】:

  • 我如何将值从类传递给 AppDelegate 类呢?通过 getter 函数?
  • 不要传递值。只需在适当的时候将您的数据保存在 HomeController 中即可。
  • 对不起,如果这是一个愚蠢的问题,我是 iOS 编程新手,但我应该使用什么通知?
  • @TheLukeGuy 见stackoverflow.com/questions/24910765/… 您可能需要使用UIApplicationDidEnterBackground
  • 成功了,非常感谢! UIApplicationDidEnterBackground 是正确的通知。
猜你喜欢
  • 1970-01-01
  • 2010-11-11
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
相关资源
最近更新 更多