2016-08-17 6 views
1

Ich habe eine ViewController-Klasse ViewController mit CollectionView. Auch ich habe Singleton Klasse FacebookManager zum Abrufen von Daten von Facebook.So rufen Sie Methode aus einer anderen Klasse in Swift

Was ich tun möchte, ist eine Methode in der Facebook-Klasse ausführen und dann eine Methode in ViewController aufrufen, um CollectionView neu zu laden.

Ich habe versucht, einen Verweis auf Viewcontroller in Facebook-Manager in Viewcontroller, indem

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

Dann Einstellung

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

Und dann in FacebookManager

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

Aber dieses doesn Aufruf zu machen arbeite nicht.

Wie wird das richtig gemacht?

+0

Da 'FacebookManager' ein Singleton ist und von überall zugänglich ist, rufen Sie die Methode auf, um Daten vom Controller abzurufen, der die Sammlungsansicht enthält. – vadian

+0

Ja, aber wie kann man dann ViewController von FacebookManager zurückrufen? –

+0

Verwenden Sie Delegate-Methoden oder Abschlussblöcke. – vadian

Antwort

0

Um die Kommunikation zwischen zwei oder mehreren Klassen zu ermöglichen, werden zwei Methoden empfohlen. 1) Delegation 2) Benachrichtigung

In Ihrem gegebenen Code zur Implementierung der Delegierung Methode müssen wir Protokoll und delegieren Eigenschaft in FacebookManager. Und zuweisen View-Controller als Delegierter zu FacebookManger

Beispiel:

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() 
    } 
} 

Aber Sie verwenden Singletonklasse deshalb in Zukunft mehr Klassen würden diese Klasse verwenden und wenn Sie mögen mehr Klassen verwenden Benachrichtigungsmethode benachrichtigen, das ist ziemlich einfach zu implementieren und sollte den Einsatz in Singletonklasse

Nachmeldung in FacebookManger sein, wenn Sie benachrichtigt werden möchten:

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

Sie haben nicht den bequemsten Weg erwähnt: 3) Rückrufe/Completion Blöcke – vadian

+0

Ja natürlich vergesse ich es zu erwähnen. Vielen Dank –

Verwandte Themen