从视图控制器调用应用程序委托方法

Call app delegate method from view controller

我想知道是否可以从另一个 ViewController 调用应用程序委托方法。

应用程序启动时,会调用 application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool i 方法。我可以从另一个视图控制器第二次调用这个方法吗?

此方法仅在应用启动时调用一次。你不能从 ViewController。而是在 AppDelegete 中创建用户定义的方法。并从 ViewController 调用该方法。通过获取 AppDelegate 的对象。

AppDelegate *appDel = (AppDelegate *)[UIApplication sharedApplication].delegate;
[appDel <Your method>];

不确定你为什么要这样做。你可能不应该,但为了回答这里的问题,它是:

// get a reference to the app delegate
let appDelegate: AppDelegate? = UIApplication.shared.delegate as? AppDelegate

// call didFinishLaunchWithOptions ... why?
appDelegate?.application(UIApplication.shared, didFinishLaunchingWithOptions: nil)

在Swift 3.0中,你可以这样调用:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.anyAppDelegateInstaceMethod()

构造函数:

在代码末尾的AppDelegateClass中添加一个构造函数

Swift 3.x

 class func shared() -> AppDelegate
{
    return UIApplication.shared.delegate as! AppDelegate
}

Swift 2.x

func appDelegate () -> AppDelegate
{
return UIApplication.sharedApplication().delegate as! AppDelegate
}

并像这样添加一个变量

var boolForFun = Bool()

如何在您的 class 中使用引用?

方法

对于 swift 3x 访问函数或变量

AppDelegate.shared().boolForFun = true

其他

appDelegate().methodFoo()

变量

appDelegate().foo

Swift4,Swift5

正如其他人所说,您不应该那样做。 如果你在某个应用程序生命周期中触发它,并使用通知中心做一些特定的事情,那就更好了。

示例(在 ViewController 中):

NotificationCenter.default.addObserver(
    self,
    selector: #selector(applicationWillEnterForeground),
    name: UIApplication.willEnterForegroundNotification,
    object: nil
)

但是,如果您确实必须调用应用程序委托方法,则可以使用此方法

let appDelegate: AppDelegate? = UIApplication.shared.delegate as? AppDelegate