2016-03-31 41 views
1

因此,現在我有一個rootViewController,其UIPageViewController作爲其唯一子視圖,rootViewController基本上是UIPageViewController的包裝類。現在我想從ViewControllerArootViewController擁有)關閉UIPageViewController的滾動。我是否應該使用委託方法或UINotificationCenter

現在我已經實現了rootViewController委託法(ViewControllerA創建),告訴它有UIPageViewController取決於由ViewControllerA提供的信息來停止滾動。但是,要使ViewControllerA能夠調用由rootViewController實現的委託方法,則需要將rootViewController作爲ViewControllerA的實例變量。

這是最佳做法嗎?會使用NSNotificationCenter是更好的選擇嗎?或者,這些方法都不是最佳選擇?

+0

當你想讓多個對象知道發生了什麼時,通常會使用通知中心 – Andrea

回答

1

最好的做法是使用一個委託或回調性質:

final class ViewControllerA: UIViewController 
{ 
    var callback: (ViewControllerA ->())? 

    func somethingHappened() 
    { 
     callback?(self) 
    } 
} 

如果你使用這種風格,一定要避免一個參考週期:

let viewControllerA = ViewControllerA() 
viewControllerA.callback = { [weak self] _ in ... } 

如果您'使用代表,避免使用參考循環weak var

weak var delegate: ViewControllerADelegate? 

這些樣式s優於NSNotificationCenter,因爲它們更安全,更易讀,更靈活。

+0

你能提供一些使用回調屬性的示例代碼嗎?我以前沒有見過,如果有人掌握了它,那將是一個很好的例子! – YellowPillow

+0

我擴展了它 - 您只需聲明一個具有可選函數類型的var,然後在創建對象時將其分配給閉包。如果你想要的話,你可以傳遞調用回調函數的對象(就像委託方法一樣),否則在這種情況下重要性較低。根據需要添加其他參數。 –

0

有很多方法可以解決您的問題。如果你可以設置添加一個rootViewController變量到你的ViewControllerA並且能夠在創建ViewControllerA的時候設置它,那麼這將是調用它的最快方法。當涉及多個線程時,我通常使用NSNotificationCenter。因此,如果我有一個異步任務正在運行,比如HTTP調用,並且需要應用程序根據結果作出相應的反應,那麼使用NSNotificationCenter是一個不錯的選擇,因爲它可以輕鬆地在應用程序範圍內發送消息,而您只需要添加根據消息的觀察者。

+0

所以我想在這種情況下使用NSNotificationCenter會有點太多? – YellowPillow

+0

在你的情況下,我想你可以只添加一個變量到你的ViewControllerA持有對你的rootViewController的引用。這將是最快的方式,因爲你只有兩個班級來處理。 –