如何在UIViewController中使用applicationDidBecomeActive?

js_*_*js_ 62 iphone objective-c ios

我想在应用程序变为活动状态或成为前台时在UIViewController中重新加载数据.

我知道在AppDelegate类中调用了applicationDidBecomeActive.
但我必须有一个UIViewController的全局变量来重新加载AppDelegate类中的数据,就像这段代码一样:

in AppDelegate.m

// global variable
UIViewController *viewController1;
UIViewController *viewController2;

-(void)applicationDidBecomeActive:(UIApplication *)application
{
    [viewController1 reloadData];
    [viewController2 reloadData];
}
Run Code Online (Sandbox Code Playgroud)

但是,当我有很多UIViewControllers时,它很不方便.

我可以在UIViewController而不是AppDelegate类中使用applicationDidBecomeActive吗?
或者有比UIViewController的全局变量更好的方法吗?

我还需要使用UIViewControllers中的以下方法:

-(void)applicationWillResignActive:(UIApplication *)application
-(void)applicationDidEnterBackground:(UIApplication *)application
-(void)applicationWillEnterForeground:(UIApplication *)application
Run Code Online (Sandbox Code Playgroud)

Apu*_*urv 143

在重新激活时,如果要为视图控制器携带特定内容,则应在其viewDidLoad方法中注册通知.

UIApplicationDidBecomeActiveNotification 如果他们已注册,将自动通知您的应用程序和给定的控制器.

 [[NSNotificationCenter defaultCenter]addObserver:self
                                         selector:@selector(yourMethod)
                                             name:UIApplicationDidBecomeActiveNotification
                                           object:nil];
Run Code Online (Sandbox Code Playgroud)

  • 是..你应该只以这种方式做..如果你在viewDidLoad方法中添加观察者,你应该在dealloc方法中删除它.如果将其添加到viewWillAppear,则应在viewWillDisAppear方法中将其删除. (3认同)
  • 使用ARC时,您可以安全地编写dealloc函数.您可以释放malloc,new创建的引用.您可以在使用ARC时删除dealloc中的观察者. (3认同)

Adr*_*eil 50

以下是在Swift中注册通知处理程序的示例(改编自Apurv上面的答案):

override func viewDidLoad() {
    super.viewDidLoad()

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

@objc func applicationDidBecomeActive(notification: NSNotification) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

更新Swift 4.2:

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)
}

@objc func applicationDidBecomeActive(notification: NSNotification) {
    // Application is back in the foreground

    print("active")
}
Run Code Online (Sandbox Code Playgroud)

  • selector:#selector(applicationDidBecomeActive)更正确;) (2认同)

Dan*_*lea 22

斯威夫特3:

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



func applicationDidBecomeActive(_ notification: NSNotification) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

注意:不要忘记删除观察者