2017-08-06 59 views
2

由於某種原因,委託方法在主視圖控制器中未被調用。我在這裏尋找另一個答案,但其中沒有一個對我有幫助。我在這裏錯過了什麼嗎? (I縮短我爲了簡單起見原代碼)代理不會調用Swift協議方法

主視圖控制器:

class VC: ParserDelegate { 
    var dataSource = Parser() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     dataSource.delegate = self 
     dataSourse.loadAndParse() 
    } 

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

} 

協議:

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

我的委託類:

class Parser { 
    weak var delegate: ParserDelegate? 

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

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

你檢查,該'delegate'不爲空? – clemens

+0

由於某種原因,它是'nil'。但是爲什麼它是'無'我不明白。 – bohdankoshyrets

+0

你是否設置了代表? – gnasher729

回答

2

委託模式是作爲在這裏正確應用,但有一件事可能在這裏出錯:在你的主視圖控制器中stantiating一個新的解析器對象並將其存儲在「數據源」:

var dataSource = Parser() 

和設置您的主視圖控制器時,作爲其代表

dataSource.delegate = self 

您的主視圖控制器得到通知,因爲這新的實例的代表你剛創建。這意味着:如果你的分析器()類的一個實例跳進(確保與調試器,如果它實際上)

loadAndParse() 

它可能是另一個對象,所以這個解析器對象沒有實際的委託。如果這是這個問題,那麼您可以考慮並直接與這個特定的Parser()類進行交流。希望這可以幫助。

+0

你是絕對正確的,我只注意到由於某種原因,我創建了另一個'Parser'類,並在其上調用'loadAndParse()'。謝謝你指出。 – bohdankoshyrets

+0

很高興我能幫助你。 – Alienbash

0

您也可以編輯這行:

來自:

dataSource.delegate = self 
dataSourse.loadAndParse() 

到:

dataSource.delegate = self 
dataSource.loadAndParse()