扩展可以在swift中替换委托吗?

时间:2016-09-06 20:45:06

标签: ios swift

我正在迅速学习代表团。本段使用示例来解释委托如何工作。

  

在这个简单的例子中,我想确保我的应用程序的根视图   控制器,UINavigationController,不允许应用程序旋转    - 此视图时,应用应仅以纵向显示   控制器负责。但UIN​​avigation- Controller不是我的班级;   它属于Cocoa。我自己的类是一个不同的视图控制器,a   UIViewController子类,充当UINavigationController的   儿童。孩子如何告诉父母如何旋转?好,   UINavigationController有一个委托属性,输入为   UINavigationControllerDelegate(协议)。它承诺发送这个   委托navigationControllerSupportedInterfaceOrientations   当它需要知道如何旋转时的消息。

我的问题:我们可以扩展myOwnViewController以获得方法" navigationControllerSupportedInterfaceOrientations"替换委托模式以实现相同的目标?

1 个答案:

答案 0 :(得分:1)

您可以扩展myOwnViewController,告诉扩展符合UINavigationControllerDelegate协议并实现您想要的方法,但这不会取代委托模式。如果您的扩展程序不符合此代理人的协议,则您将无法将myOwnViewController作为UINavigationController's代理人附加。

class MyController: UIViewController {
}

extension MyController: UINavigationControllerDelegate {
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return .Portrait
    }
}
let navigationController = UINavigationController()
let controller = MyController()
navigationController.delegate = controller

通过告诉MyController类符合UINavigationControllerDelegate协议,可以实现相同的结果。

class MyController: UIViewController, UINavigationControllerDelegate {

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return .Portrait
    }

}
let navigationController = UINavigationController()
let controller = MyController()
navigationController.delegate = controller

这两个示例导致MyController成为UINavigationController的委托。这可能导致在一个地方承担很多责任。为了分担这一责任,您可以创建另一个将成为导航控制器委托的类。

class MyController: UIViewController {}

class NavigationDelegate: NSObject, UINavigationControllerDelegate {

    func navigationControllerSupportedInterfaceOrientations(navigationController: UINavigationController) -> UIInterfaceOrientationMask {
        return .Portrait
    }

}
let navigationController = UINavigationController()
let controller = MyController()
let navigationDelegate = NavigationDelegate()
navigationController.delegate = navigationDelegate

有什么区别?想象一下,您已经为支持的定位方法实现了复杂的逻辑,并且发现您不再使用MyController,而是使用DifferentController。由于您的方向逻辑位于MyController,因此您无论如何都需要创建它。但是,如果您的委托逻辑在NavigationDelegate类中分开,则可以使用DifferentController而无需为这些委托方法创建MyController类。