在Swift中从AppDelegate调用自定义委托

时间:2015-07-02 08:47:48

标签: ios swift swift2

我在AppDelegate.swift中有这个委托,一旦另一个应用程序使用网址方案打开我的应用程序就会触发。

AppDelegate.swift

 func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
        return true
 }

当另一个应用程序使用url方案打开我的应用程序时,它会正常启动,但是当此函数触发时,我想通知某个ViewController。我以为我可以使用自定义委托执行此操作,并让AppDelegate通知谁曾经实现我的委托,即某人已打开该应用程序。

MyDelegate.swift

protocol MyDelegate {
    func opened(hasBeenOpened: Bool!)
}

然后我的ViewController实现了这个Delegate

LoginViewController.swift

import UIKit

/* Obviously this class has more code and other functions, 
but for the illustration of the problem, I removed all the other unrelated things.*/

class LoginViewController: UIViewController, MyDelegate {
    func opened(hasBeenOpened: Bool!) {
        print(hasBeenOpened)
    }
}

到目前为止一切顺利,但让我们回到AppDelegate.swift中的openURL()函数并尝试调用MyDelegate.opened()。这就是我完全迷失的地方。

AppDelegate.swift

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {

        print("openURL delegate running")

        if var delegate = MyDelegate?() {
            delegate.opened(true)
        }

        return true
    }

控制台打印" openUrl委托运行",所以它正在运行,但我的委托变量变为nil。我缺少一些初始化吗?

我似乎无法弄清楚如何从AppDelegate调用自己的自定义委托。有没有其他方法通知ViewControllers这已经发生了?或者这总体上是一个坏主意,还有另一种方式被认为更好吗?

提前谢谢大家,我真的很感激帮助。

3 个答案:

答案 0 :(得分:2)

您正尝试初始化无法实现的协议(var delegate = MyDelegate?())。

使用委托的方式是通过在LoginViewController中执行的类注册一致性,并直接在该类的实例上调用协议中定义的方法。

例如:

var loginViewController = // get an instance of LoginViewController
loginViewController.opened(true)

在这种情况下,您无法访问实例,在App Delegate中保留对视图控制器的引用也不是一种好的做法。所以我认为你正在寻找的范例是通知。请查看NSNotificationCenterNSHipster article on notifications

的文档

答案 1 :(得分:1)

如果这是一个好的或坏的想法没有详细说明,问题是delegate中的AppDelegate属性永远不会被初始化。在UIViewController的初始化方法中,您需要访问AppDelegate并将委托属性设置为self

答案 2 :(得分:0)

尝试NSNotification,我认为在AppDelegate中保留特定的视图控制器是个好主意。