0

使用Cocoa-Touch,但這是一個普遍的問題。MVC - 視圖可以繼續引用其視圖控制器並處理數據嗎?

視圖可以保留對其視圖控制器的引用並處理數據嗎?我最近遇到了一個通過應用程序執行此操作的代碼庫 - 例如,有一個表視圖控制器,它的單元對視圖控制器的引用很弱(因此沒有保留週期)。細胞通過

[self.parentVC presentViewController.....]; 

提出新的視圖控制器,並以類似的方式解僱它。此外,他們也處理數據/網絡操作的變化。

直到我看到這個,我習慣於爲每個單元格創建協議並通過它們與父視圖控制器交談。使用直接參考視圖控制器的方法擺脫所有的協議。

對我來說這似乎很糟糕,但不知道它是否普遍。

回答

5

即將出現的答案是關於Apple處理模型視圖控制器的方式,它與其他SDK(例如Qt)完全不同。

這絕對是不好的做法。如果你認爲這是一個好主意,那麼它可以歸結爲一個問題,,那麼爲什麼Apple沒有在UIView類中添加該參考?

如果你看一下如何Apple uses the model view controller,該模型是相當清楚的:

enter image description here

視圖與控制器的信號的狀態變化進行通信,如果需要的話,並更新視圖控制器更新模型因此。你永遠不會找到一個文件或Apple的樣本,你的視圖將更新堆棧控制器。

如果UIView子開始舉辦參照該是抱着它(即使它是一個弱引用),要刪除朝着它的控制器視圖的抽象控制器(參考走另一條路),因此,強烈鼓勵那些使用相同代碼的人進行不良行爲。

什麼會阻止另一位開發人員此次添加參考視圖所附的「模型」?

現在我不是說這會把你的代碼變成意大利麪條代碼(你仍然可以製作一個體面的應用程序),我說這是真的(真的!)不好的做法。

希望這已經夠清楚了。

+0

感謝您的詳細回覆。信不信由你,我談論的代碼庫是由一家領先的應用開發公司編寫的,我很驚訝我不得不問。 – 0xSina 2013-02-22 15:30:09

+0

「如果您認爲這是一個好主意,那麼爲什麼Apple沒有在UIView類中添加該參考」 非常好的關於框架的思考方式。當然,並不是所有事情的答案,但是肯定我關於「不打架」的很好的指導方針, – Cezar 2013-02-23 14:42:38

0

我認爲可能是兩個:真的很差,很普遍。

視圖應該是通用的,他們不需要知道任何關於其控制器的細節。溝通應限於委託(協議),數據源(協議)或目標行動。

0

那麼......這並不罕見,也不是很好的風格。我自己做到了,幾乎迷路了。當有需要時,我嘗試採用委託模式。這意味着,是的,我確實保留了對恰好是視圖控制器的委託的引用。委託對象確實履行了一個協議,我總結了我將要調用的所有視圖控制器(委託)的方法。

在這種情況下,您的示例中,單元格會通過調用方法來通知視圖控制器發生的事情,然後視圖控制器將調用下一個要調用的視圖控制器。

通過這樣做,我實現了同樣的事情,但堅持到MVC模式,因此總是知道在哪裏尋找什麼樣的功能 - 即使在一年左右。

相關問題