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

21
我想知道是否可以从另一个ViewController调用应用程序委托方法。
当应用程序启动时,会调用application(application:UIApplication,didFinishLaunchingWithOptions launchOptions:[NSObject:AnyObject]?) -> Bool 方法。 我能否从另一个视图控制器再次调用此方法?

5
可以,但是不应该。 - Andrey Chernukha
你能展示给我如何做吗? - Memon Irshad
2
请查看此解释:http://stackoverflow.com/a/8569646/3202193 - Ashish Kakkad
5个回答

53

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

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

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

谢谢你帮助我。 - Memon Irshad
没问题。如果您有时间,请解释一下为什么要调用这个函数两次。无论如何,请务必阅读Ashish Kakkad的链接帖子。 - Juan Carlos Ospina Gonzalez
当应用程序首次启动时,显示条款和条件页面。当用户点击同意按钮时,可以进入下一个登录视图控制器并进行登录。但是,如果用户点击拒绝按钮,则调用下一个视图控制器。如果用户按下登录按钮,则返回到条款和条件页面并同意条件。 - Memon Irshad
1
在Swift4中使用以下代码:let appDelegate = UIApplication.shared.delegate as! AppDelegate - Mashhadi
我的理解在这个领域是有限的,所以我只想问一下:这个答案是创建了一个新的AppDelegate对象,然后将appDelegate引用它吗? - benc

25

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

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

8

这个方法在应用程序启动时只会被调用一次。你不能从ViewController中调用它。相反,你需要在AppDelegate中创建一个用户定义的方法,并通过获取AppDelegate对象来从ViewController中调用该方法。

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

你的第一行代码缺少一个 [ 符号。我猜这是正确的代码?AppDelegate *appDel = [(AppDelegate *)[UIApplication sharedApplication] delegate]; - Mymozaaa

1

Swift 4,Swift 5

正如其他人所说,你不应该那样做。 最好是在特定的应用程序生命周期内触发它,并使用通知中心执行特定操作。

示例(在ViewController中):

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

然而,如果你必须调用应用程序委托方法,你可以使用这个

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

1

构造函数:

在AppDelegate类的代码末尾添加一个构造函数

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
}

and add a var like this

var boolForFun = Bool()

如何在类中使用引用?

方法

对于Swift 3x,访问函数或变量

AppDelegate.shared().boolForFun = true

for else

appDelegate().methodFoo()

变量
appDelegate().foo

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