2013-07-06 90 views
3

我試圖以最好的方式重構我的代碼,我想知道給定情況的適當架構是什麼。UIView或UIViewController子類?

我正在嘗試做

我在做什麼是很簡單:我有一些自定義的CALayer子類表示交互UI元素。由於UI的某些部分是靜態的,因此它們分成多個層次,所以我不想不必要地重繪那些靜態元素。目前,這些圖層作爲CustomView類的初始化部分中的子圖層添加,該類是UIView的子類。

目前沒有相應CustomViewController類是UIViewController一個子類,因爲當我使用CustomView,它包含一個UITableViewCell或通用的UIViewController與它的其他意見的一部分中,所以我覺得另一個UIViewController對於每個CustomView實例將是多餘的。

同樣重要的是,我在UIView類中做的唯一操作是響應觸摸事件並將觸摸信息發送到子層,以便UI可以相應地更新其外觀。我不是覆蓋drawRect方法或類似的東西。

問題

基本上,我想弄清楚我是否應該:

選項1:

擺脫CustomView類,創建一個類CustomViewController這是UIViewController的子類,並且只需將CALayer對象作爲CustomViewController的內置view屬性的子圖層。

選項2:

我對UIViewController子是多餘的想法是正確的,所以我要離開它,我有它的方式,有一個CustomView類內的CALayer對象它。

我非常感謝任何關於此的建議。

+0

我已經完成了與以前完全相同的操作。我也用UIViewController來完成它。只要代碼是可維護和高性能的,那麼我想它並不重要。 UIViewController是(我猜)是這樣做的更正確的方法,但它也可能會妨礙性能,特別是如果你把它放在UITableViewCell中,並且可能有很多。 – Fogmeister

+0

感謝您的快速響應。很高興聽到我沒有用當前實現的非'UIViewController'方式。 –

回答

0

我認爲,就MVC而言,您所描述的代碼(選項#2)寫得很好,並且保留了一個非常明確的責任邊界。你並沒有編寫任何與這個類中的視圖層本身無關的代碼,這非常棒。我認爲在這種情況下,不需要單獨的子類來管理這些實例,因爲正如您所說 - 他們正在處理自己的觸摸事件和可見圖層(完全是他們的責任)。

如果由於任何原因需要更復雜的需要與數據相關的邏輯或其他此類計算的東西,我肯定會考慮繼承UIViewController或者可能以完全不同的方式來查看問題。

鑑於你所提出的情況,我認爲在這個UIView子類('CustomView')中維護CALayer實例是正確的選擇。

+0

感謝您的迴應!儘管尚未實現,但UI元素將根據從iCloud保存/加載的信息進行動畫處理。你以爲我會使用iCloud嗎?我應該實現選項1中描述的UIViewController方法嗎?對於選項1的替代方法是執行類似於'CustomView * cv = [[CustomView alloc] initWithData:elementData];',其中elementData已經被'UITableViewController'等加載。但是,該替代可能會打破MVC概念,因爲它將模型與觀點混合在一起。 –

+0

在我看來,UIView的子類不應該有'initWithData'方法 - 這無疑是與MVC範式相矛盾的。如果要從iCloud下載數據,則可能需要考慮更復雜的事情。另一方面,我看到很多處理緩存的UIImageView子類 - 緩存與存儲有關(與視圖元素沒有任何關係)。在這個問題上有確定的「正確」和「錯誤」,儘管保持可理解的代碼很重要。 – Stavash

+0

我發佈後,我認爲,而不是給UI元素的實際數據,我可以有一個方法,設置該元素應該動畫的任意整數。例如,設置'UITableViewCell'時,我可以執行以下操作:'[[CustomView alloc] initWithValue:data.integerValue];'其中data是由'UITableViewController'和'integerProperty'加載的iCloud數據是直接對應於UI元素外觀的值。我認爲這將保持MVC模式的完整性。 –

相關問題