如何在应用程序委托中调用视图控制器中的方法?

我需要在AppDelegate的ViewController类中调用一个方法。 这就是这个方法的样子:

class ViewController: UIViewController {

    func myFunction() {
        ...
    }
}

我试过使用window.rootViewController,但它告诉我myFunction不存在的方法,因为rootViewController的类型是UIViewController。

我也试过了

var vc = ViewController()
self.vc.myFunction()

但是这是创建ViewController类的一个新实例,这也不是我想要的。

以下是我需要从以下位置调用myFunction的AppDelegate代码的一部分:

class AppDelegate: UIResponder, UIApplicationDelegate {

    func handleEvent() {
        if UIApplication.shared.applicationState == .active {
            // call myFunction()
        }
        else {
            ...
        }
    }
}

上下文:我正在遵循一个geofencing教程:https://www.raywenderlich.com/136165/core-location-geofencing-tutorial

由于即使应用程序已关闭,用户位置也受到监视,所以当事件触发时,应使用AppDelegate处理事件,因为视图控制器尚未加载。

在处理事件的AppDelegate中,如果应用程序处于活动状态,我想弹出警告让用户选择停止监视位置。 停止位置监视的功能(myFunction)在视图控制器中。


如果它的根源很容易:

(window.rootViewController as? ViewController)?.myFunction()

如果它位于navigationController的顶部

((window.rootViewController as? UINavigationController)?.topViewController as? ViewController)?.myFunction()

但无论是哪种情况都很奇怪,可能不是正确的做法。 改为使用NotificationCenter并在AppDelegate中发布通知名称,然后让ViewController监听消息并作出相应的响应。


发送通知听起来像一个更清洁的方式。 但是要做OP所尝试的东西,虽然不干净,但我曾经在Xcode的早期阶段做过,而且在完成时我没有任何问题。

假设您想从AppDelegate.m的myViewCtlr中调用myMethod

在应用程序代表这样做

//In AppDelegate.h define
...
UIViewController *cur_ViewCtrl
... 
@property (nonatomic, retain) UIViewController *cur_ViewCtrlr;


// in the AppDelegate.m you can call the method like this:

@synthetize cur_ViewCtrlr;
... 
if([cur_ViewCtrlr isKindOfClass:[myViewCtlr class]])
       [(myViewCtlr*) cur_ViewCtrlr myMethod:arg];
...    

然后,您只需将指针设置为当前控制器,为简单起见,我将ViewDidLoad放在ViewWillAppear中,如果您翻转不同屏幕,但想法相同

// In myViewController
...
- (void)viewDidLoad
{
  ...
  AppDelegate *My_delegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
  //and set the reference to this conrtoller in the appDelegate
  My_delegate.cur_ViewCtrlr = self; 
...

你不应该从appdelegate调用视图控制器方法。 是不好的做法,通常不是必需的。 如果您想对诸如willResignActive willTerminate等方法做出反应

您应该使用NotificationCenter收听这些事件的通知。

链接地址: http://www.djcxy.com/p/68295.html

上一篇: How to call method in view controller in app delegate?

下一篇: Switching between Auto Layout ON / OFF, in different ViewControllers?