2016-09-06 40 views
0

我正在快速學習代表團。本段使用示例來解釋委派如何工作。擴展名可以在swift中替換委派嗎?

在這個簡單的例子,我想確保我的應用程序的根視圖 控制器,一個UINavigationController,不允許應用旋轉 - 當這種觀點 控制器是應用程序應該只出現在縱向方向負責。但是UINavigation-控制器不是我的課程;它屬於可可。我自己的類是一個不同的視圖控制器,它是一個UIViewController子類,它充當UINavigationController的子元素 。孩子如何告訴父母如何旋轉?那麼, UINavigationController具有委託屬性,類型爲 UINavigationControllerDelegate(協議)。當它需要知道如何旋轉時,它承諾發送這個 委託的navigationControllerSupportedInterfaceOrientations 消息。

我的問題:我們可以擴展myOwnViewController以使方法「navigationControllerSupportedInterfaceOrientations」取代委派模式來實現相同的目標嗎?

回答

1

你可以擴展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類。

+0

您可以比較兩種方式:使用擴展和段落中描述的原始方式嗎? –

+0

我已經通過比較更新了評論。我希望這會讓它更清楚地理解。 – Eluss

+0

另一個問題:爲什麼不'UINavigationController'包含'navigationControllerSupportedInterfaceOrientations'方法本身?同樣的原因?爲了靈活性? –