我在AppDelegate.swift中有此委托,一旦另一个应用使用URL方案打开我的应用,该代理就会触发。

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实现此委托

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这已经发生了吗?还是这是一个坏主意,是否有另一种更好的方法?

预先谢谢大家,非常感谢您的帮助。

最佳答案

您正在尝试初始化不可能的协议(var delegate = MyDelegate?())。

使用委托的方式是在类上注册一致性,这是在LoginViewController中完成的,然后直接在该类的实例上调用协议中定义的方法。

例如:

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

在这种情况下,您无权访问实例,在App Delegate中保留对视图控制器的引用也不会被视为一种好习惯。因此,我认为您正在寻找的范例是通知。查看NSNotificationCenterNSHipster article on notifications的文档。

08-25 12:57
查看更多