你可以擴展myOwnViewController
,告訴擴展符合UINavigationControllerDelegate
協議並實現你想要的方法,但是這並不代替委託模式。如果您的分機不符合此代表的協議,您將無法附加作爲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
類。
您可以比較兩種方式:使用擴展和段落中描述的原始方式嗎? –
我已經通過比較更新了評論。我希望這會讓它更清楚地理解。 – Eluss
另一個問題:爲什麼不'UINavigationController'包含'navigationControllerSupportedInterfaceOrientations'方法本身?同樣的原因?爲了靈活性? –