2016-08-17 69 views
1

我有一個帶有collectionView的viewcontroller類ViewController。我也有單身類FacebookManager從Facebook獲取數據。如何從另一個類中快速調用方法

我想要做的是在Facebook類中運行一個方法,然後在ViewController中調用一個方法來重新加載collectionView。

我試圖通過設置

class FacebookManager { 
    static let sharedInstance = FacebookManager() 
    var vc:ViewController? 
} 

,使Facebook的管理者的ViewController參考然後在視圖控制器

class ViewController: { 
    func viewDidLoad() { 
     FacebookManager.sharedInstance.vc = self 
    } 
} 

設置,然後調用FacebookManager

func myMethod() { 
    vc.collectionView.reloadData() 
} 

但是這並未沒有工作。

如何正確執行此操作?

+0

由於'FacebookManager'是一個單身人士,並且可以從任何地方訪問,因此請調用該方法從包含集合視圖的控制器中獲取數據。 – vadian

+0

是的,但如何從FacebookManager調用ViewController回來? –

+0

使用委託方法或完成塊。 – vadian

回答

0

要提供兩個或多個類之間的通信,有兩種建議的方法。 1)代理 2)通知

在你給定的代碼實現委託方法,我們必須在FacebookManager中創建協議和委託屬性。並指定視圖控制器作爲代表到FacebookManger

例子:

protocol FacebookManagerDelegate: class { 
    func refreshData() 
} 

class FacebookManager { 
    var weak delegate:FacebookManagerDelegate? 
    func myMethod() { 
    delegate?.refreshData() 
    } 
} 

class ViewController: FacebookManagerDelegate { 
    ViewDidLoad() { 
    FacebookManager.sharedInstance.delegate = self 
    } 

func refreshData() { 
    self.collectionView.reloadData() 
    } 
} 

但使用的是單例類,因此在未來的多類將使用這個類,如果你想通知多個類使用的通知方法,這很容易實現,應該是在單獨的類

在FacebookManger郵政通知,每當你想通知使用:

class FacebookManager { 
    func myMethod() { 
    NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil) 
    } 
} 

class ViewController { 
    ViewDidLoad() { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector:#selector(reloadData(_:)), name: NotificationName, object: nil) 
    } 
    deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

func reloadData(notification: NSNotification) { 
    self.collectionView.reloadData() 
    } 
} 
+1

你沒有提到最方便的方法:3)回調/完成塊 – vadian

+0

是的,當然,我忘了提及它。謝謝 –

相關問題