swift ios - 如何从 AppDelegate 在 ViewController 中运行函数

Posted

技术标签:

【中文标题】swift ios - 如何从 AppDelegate 在 ViewController 中运行函数【英文标题】:swift ios - How to run function in ViewController from AppDelegate 【发布时间】:2017-05-07 12:41:15 【问题描述】:

我正在尝试使用 AppDelegate 在某些 ViewController 中运行一个函数

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

我错过了什么?

谢谢!

【问题讨论】:

***.com/a/34745677/2303865 某些视图控制器是初始视图控制器吗?如果是,则在AppDelegate 中创建一个属性,并将对该视图控制器的引用分配给该属性。如果不是 - 反过来 - 在 certain 控制器的viewDidLoad() 中获取 AppDelegate 实例并从那里分配引用。 Notification 很可能不需要。 【参考方案1】:

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

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

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

确保您也删除了观察者,这通常在 deinit 方法中完成

deinit() 
    NotificationCenter.default.removeObserver(self)
 

【讨论】:

我什么时候应该移除观察者? deinit 通常是删除它的最佳位置。这意味着当视图控制器被取消初始化(从内存中释放)时,它将自己作为观察者移除。我曾经在 viewDidUnload 中执行此操作,但现在已弃用【参考方案2】:

我只是这样解决的:

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

【讨论】:

不要这样做。您应该使用 Scriptable 发布的方法 如果有时您需要重新加载 tableview 之类的事情,您的应用会崩溃

以上是关于swift ios - 如何从 AppDelegate 在 ViewController 中运行函数的主要内容,如果未能解决你的问题,请参考以下文章

应用程序关闭之前/应用程序打开之前的 Swift iOS 9+ [重复]

Swift如何在系统启动之前更改从firebase(FCM)收到的通知标题和正文?

iOS系列 基础篇 03 探究应用生命周期

如何使用swift从ios应用程序调用苹果钱包

如何从 iOS 中的流中接收数据(swift)

iOS 如何从相机加载照片以解析 Swift