2017-08-06 5 views
2

Pour une raison quelconque, la méthode déléguée n'est pas appelée dans le View Controller principal. Je cherchais d'autres réponses ici, mais aucun d'eux ne m'a été utile. Est-ce que j'ai râté quelque chose? (J'écourté mon code d'origine pour l'amour de la simplicité)La méthode du protocole Swift n'est pas appelée par le délégué

Vue principale du contrôleur:

class VC: ParserDelegate { 
    var dataSource = Parser() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     dataSource.delegate = self 
     dataSourse.loadAndParse() 
    } 

    func didReceiveDataUpdates(store: [WeatherModel]) { 
     print("Delegate method triggered.") 
    } 

} 

Protocole:

protocol ParserDelegate: class { 
    func didReceiveDataUpdates(store: [WeatherModel]) 
} 

Ma classe déléguée:

class Parser { 
    weak var delegate: ParserDelegate? 

    func loadAndParse() { 
     var store = [WeatherModel]() 
     // Doing something 

     delegate?.didReceiveDataUpdates(store: store) 
    } 
} 
+2

Avez-vous vérifié que le 'delegate' n'est pas nul? – clemens

+0

Il est «nul» pour une raison quelconque. Mais pourquoi c'est «nul», je ne comprends pas. – bohdankoshyrets

+0

Avez-vous défini le délégué? – gnasher729

Répondre

2

Le motif délégué est d'être appliqué correctement ici, mais une chose qui pourrait mal tourner ici: Dans votre View Controller principal, vous êtes en stantiating un nouvel objet Parser et le stocker dans « dataSource »:

var dataSource = Parser() 

Et lors de la configuration de votre principal contrôleur de vue comme délégué

dataSource.delegate = self 

votre contrôleur principal Voir reçoit la notification en tant que délégué de cette nouvelle instance vous venez de créer. Cela signifie: Si une instance de votre classe Parser() saute dans (assurer avec le débogueur, si elle ne fait)

loadAndParse() 

il est peut-être un autre objet et si cet objet analyseur n'a pas délégué réel. Si c'est le problème ici, vous pouvez envisager et sortir afin de pouvoir parler directement à cette classe Parser() spécifique. J'espère que cela t'aides.

+0

Vous avez absolument raison, je viens de remarquer que pour une raison quelconque j'ai créé une autre classe 'Parser' et je l'ai appelée' loadAndParse() '. Merci d'avoir fait remarquer cela. – bohdankoshyrets

+0

Je suis heureux de pouvoir vous aider. – Alienbash

0

Vous pouvez également modifier cette ligne:

de:

dataSource.delegate = self 
dataSourse.loadAndParse() 

à:

dataSource.delegate = self 
dataSource.loadAndParse()