Swift iOS - 如何从AppDelegate运行ViewController中的函数

7

我正在尝试在特定的ViewController中使用AppDelegate运行一个函数

func applicationDidBecomeActive(_ application: UIApplication) {
        ViewController().grabData()
}

但是当从后台进入应用程序时,该函数似乎根本没有运行。
该函数如下所示:
func grabData() {
        self._DATASERVICE_GET_STATS(completion: { (int) -> () in
            if int == 0 {
                print("Nothing")
            } else {
                print(int)

                for (_, data) in self.userDataArray.enumerated() {
                    let number = Double(data["wage"]!)
                    let x = number!/3600
                    let z = Double(x * Double(int))
                    self.money += z
                    let y = Double(round(1000*self.money)/1000)

                    self.checkInButtonLabel.text = "\(y) KR"
                }

                self.startCounting()
                self.workingStatus = 1
            }
        })
    }

并使用这个变量

var money: Double = 0.000

我错过了什么?
谢谢!

1
https://dev59.com/7FsW5IYBdhLWcg3woYji#34745677 - Leo Dabus
1
这个 特定的 视图控制器是初始视图控制器吗?如果是,就在 AppDelegate 中创建一个属性,并将该视图控制器的引用分配给该属性。如果不是 - 反之亦然 - 在 特定的 控制器的 viewDidLoad() 中获取 AppDelegate 实例,并从那里分配引用。Notification 很可能不需要。 - vadian
2个回答

14

ViewController().grabData()将创建一个ViewController的新实例并调用此函数。然后,由于视图控制器没有在使用中,它将被垃圾回收/从内存中删除。您需要在实际正在使用的视图控制器上调用此方法。而不是它的新实例。

最好的选择是监听iOS提供的UIApplicationDidBecomeActive通知。

NotificationCenter.default.addObserver(
    self,
    selector: #selector(grabData),
    name: NSNotification.Name.UIApplicationDidBecomeActive,
    object: nil)

确保您还要删除观察者,通常在deinit方法中完成此操作。

deinit() {
    NotificationCenter.default.removeObserver(self)
} 

我应该在什么时候移除观察者? - Victor
1
deinit通常是最好的地方来移除它。这意味着当视图控制器被取消初始化(从内存中释放)时,它会将自己作为观察者移除。我曾经在viewDidUnload中这样做,但现在已经被弃用了。 - Scriptable

3
我是这样解决的:

我只是这样解决的:

func applicationDidBecomeActive(_ application: UIApplication) {
        let viewController = self.window?.rootViewController as! ViewController
        viewController.grabData()
}

不要这样做。你应该使用 Scriptable 发布的方法。 - Leo Dabus
1
如果有时您需要像重新加载“tableview”这样的操作,我认为您的应用程序会崩溃。 - mike vorisis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接