如何从视图控制器访问applicationDidEnterBackground函数

5

如何从viewController调用在AppDelegate中的applicationDidEnterBackground方法?

我想在不按Home键的情况下在应用程序的后台运行一个函数。

9个回答

13

您不应该从任何地方调用该函数。它存在的目的是让您知道应用程序何时进入后台。

如果您只想知道应用何时进入后台,那么您可以创建一个通知来帮助您实现:

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(handleEnteredBackground:) 
                                             name: UIApplicationDidEnterBackgroundNotification
                                           object: nil];

我想在应用程序的后台运行一个函数而不需要按下Home键。 - Eman87
那么你需要学习关于后台任务的知识:https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW20 - joelg
@joelg 你什么时候取消订阅通知呢?你是在 didTerminate 中删除所有的订阅者吗? - Bhargav
未声明选择器'handleEnteredBackground:'警告,我应该在哪里声明?请更新您的问题。 - iOS Developer

3

Swift 4

当应用进入后台时,如果你想在视图控制器中运行某些东西(通常是保存一些用户数据),可以使用以下方法:

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: nil) { (notification) in
        print("app did enter background")

        // run your code here (or whatever)
    }

    // ...

}

这对我来说很有效,正是我在代码中寻找的解决选项,以解决当应用程序被隐藏并放入后台时,选项卡栏会进一步跳出屏幕的问题。我只需添加一个链接函数,使选项卡栏在关闭应用程序时重新出现,然后所有问题都得到了解决。 - David_2877

1

Swift 4

NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: nil) { (notification) in
}

0

这是另一种方式,它也可以在后台运行。 通常情况下,您需要在viewController.m的init方法(或其他适当的位置)中首先注册通知:

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(someMethod:) 
                                             name: @"NotificationNameHere"
                                           object: nil];

在您的应用程序委托中触发通知:
- (void)applicationDidEnterBackground:(UIApplication *)application
{

    [[NSNotificationCenter defaultCenter] postNotification: @"NotificationNameHere"];

}

0

你应该在viewDidLoad方法中注册一个通知。

如果已经注册了'UIApplicationDidBecomeActiveNotification',它将自动通知你的应用程序和给定的控制器。

 [[NSNotificationCenter defaultCenter]addObserver:self
                                         selector:@selector(yourMethod)
                                             name:UIApplicationDidBecomeActiveNotification
                                           object:nil];

0

在你的 ViewController 中

#import "AppDelegate.h"

@property AppDelegate *appDelegate;

在你的viewDidLoad方法中

appDelegate=[[UIApplication sharedApplication] delegate];

调用AppDelegate中的函数

 [appDelegate applicationDidEnterBackground:[UIApplication sharedApplication]];

0

这是一个委托方法。您不应手动调用此方法。如果您想调用在此方法中返回的代码,则应创建一个函数并将代码移动到该函数中。然后,您应该调用此函数。


我想在应用程序后台运行函数而不需要按home键。 - Eman87
使用performselectorinbackground方法。 - Apurv

0

在你的ViewController中

导入 "AppDelegate.h"

@property AppDelegate *appDelegate; 在你的viewDidLoad中

_appDelegate=[[UIApplication sharedApplication] delegate]; 调用来自AppDelegate的函数

[_appDelegate applicationDidEnterBackground:[UIApplication sharedApplication]];


1
你可以使用代码块来展示代码,这样看起来更加美观易读。 :) - Jonathan Eustace

-1
[[UIApplication sharedApplication].delegate applicationDidEnterBackground: [UIApplication sharedApplication]]

这行代码出错了。(没有已知的实例方法可以调用applicationDidEnterBackground选择器) - Eman87
抱歉,我忘记了参数。 - mxb

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