我正在迅速学习代表团。本段使用示例来解释委托如何工作。
在这个简单的例子中,我想确保我的应用程序的根视图 控制器,UINavigationController,不允许应用程序旋转 - 此视图时,应用应仅以纵向显示 控制器负责。但UINavigation- Controller不是我的班级; 它属于Cocoa。我自己的类是一个不同的视图控制器,a UIViewController子类,充当UINavigationController的 儿童。孩子如何告诉父母如何旋转?好, UINavigationController有一个委托属性,输入为 UINavigationControllerDelegate(协议)。它承诺发送这个 委托navigationControllerSupportedInterfaceOrientations 当它需要知道如何旋转时的消息。
我的问题:我们可以扩展myOwnViewController以获得方法" navigationControllerSupportedInterfaceOrientations"替换委托模式以实现相同的目标?
答案 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
类。