2017-04-23 62 views
0

假設我有ViewController A,它的viewModel AVM。 A有一個containerView,它是ViewController B和它的viewModel BVM。 A具有B的參考,AVM具有BVM作爲其子View Model的參考。帶有子MVVM的MVVM如何在iOS中工作?

我有一個C,這是一個管理器類控制B的行爲,從B.

乙調用乙功能,諸如setSDImage(URL)已經一個UIImageView並且具有setSDImage(URL)函數回調。 A有一個按鈕,當按鈕按下時,應該觸發 B的setSDImage(url)。

所以問題是:按下按鈕從A,去AVM,到B,現在,C必須得到B的引用,因爲函數調用是setSDImage(url),它是UI層。此外,回調需要B到實施爲好,這就是爲什麼我不知道如何在這個BVM工作,而不是B.

所以,在這種情況下的問題:

1,經理級C,控制B的行爲。AVM如何在不通過B的引用的情況下聯繫C? (因爲VM不想知道ViewControllers/views)

2,管理員類C應該控制B還是BVM?我讓它控制B而不是BVM,因爲a)設置的圖像函數必須在B的UILayer中完成。b)回調需要在UILayer中實現?

回答

1

從您的描述中瞭解發生了什麼有點困難,但我會說一個名爲setSDImage的方法需要一個URL不屬於視圖控制器,因爲視圖控制器需要完成這項工作下載圖像數據,將其轉換爲UIImage,然後將其設置爲UIImagView

下載圖像並轉換它的工作應該由BVM啓動,然後在UIImage準備就緒時通知B

所以,回答你的第二個問題,我認爲C應該有一個BVM,這應該很容易AVM

這有道理嗎?

+0

Thx爲答覆。我正在使用SDWebImage庫下載圖像。它們的功能是''[imageView sd_setImageWithURL:[NSURL URLWithString:@「https://graph.facebook.com/olivier.poitrey/picture」] placeholderImage:[UIImage imageNamed:@「avatar-placeholder.png」] 選項:SDWebImageRefreshCached];''。這意味着我應該在視圖控制器中完成它。因爲它直接設置爲UIImageView而不是UIImage。 –

+0

我不是'UIView'上的那些擴展類型的粉絲。從技術上講,代碼沒有在視圖中實現,但是它將這種行爲附加到視圖上,所以對我來說,這感覺就像是對MVC和MVVM的違反。但是,您仍然可以按照相同的模式傳遞URL而不是UIImage。 MVVM的關鍵在於VC可以直接與VM通信,但是VM只能通過協議或KVO間接與VC進行通信,或者您希望通過任何通知機制進行通信。 –