2013-06-20 64 views
6

也許這是一個愚蠢的問題,但我在iOS開發過程中遇到過很多次。iOS - 何時創建一個子ViewController與UIView子類?

有時候我會開發一個我想在多個屏幕上使用的視圖組件,所以我將決定子類UIView,並使其可以在多個地方使用。

然後,我開始添加功能。也許它需要響應NSNotification,或者它應該響應用戶觸摸。

在某個時候,我開始想知道是否真的應該製作一個UIViewController子類,並將其作爲子ViewController添加到我的UI中。

對於在何處添加一些行爲到UIView以及何時創建完整UIViewController之間的界限有什麼共識嗎?

回答

3

您應該隨時使用控制器來處理或控制數據。觀點應該儘可能愚蠢,不知道他們展示的是什麼,而是在哪裏。您可以輕鬆子類和重用ViewControllers。一個很好的例子,假設你需要通過popover控制器和模態從整個應用程序中檢索用戶的字符串(或文本)。創建一個UIViewController的通用子類,該子類具有包含文本字段和按鈕的視圖。然後,您可以使用該視圖,並以您需要的任何容量使用該控制器。在popover,modal或其他任何地方重複使用它(並且通常通過委派將數據傳回)。由於你正在處理數據,你不應該使用UIView的唯一的子類。

從我的經驗來看,我更經常地的子類UIViews。對於我來說,如果您只是在討論容器或在通用應用程序工作流程中重複使用視圖,這有點困難。無論哪種方式,但它應該是相同的。

+0

漂亮。這一直是我的傾向。 –

+0

促使我發佈這種情況實際上是爲了不會被重用的東西..它對於特定的屏幕非常具體。然而,這個組件有很多管道,它真的覺得它需要更好地與ViewController分離,包含在內。 –

+0

是的,我知道你的意思。針對特定情況對UIViewController進行子類化並不是一個壞主意,但試圖使它們儘可能通用。就像在我的例子中,不要將它命名爲'ColorNameCollector'或其他東西,因爲它只能用於獲取顏色。而是將其命名爲'StringCollector'。這種方式更通用,無論何時需要從用戶那裏獲取字符串,都可以使用它,而不管它在何處或如何呈現/使用。 – Firo

0

我已經使用嵌入視圖控制器不時加載可重用的表視圖。我發現它有時非常有用,但並非總是如此。兩者之間的通信可能非常麻煩,就像您希望嵌入式控制器與容器進行通信一樣。授權使得它更容易,但仍然很麻煩。它還限制你到iOS 6,如果我記得iOS 5和更低版本不支持嵌入式控制器。

如果只是添加方法,您可以使用一個類別來存儲一些額外的方法。我在NSManagedObjects上做了很多,我不想子類,如果我從數據模型重新生成NSManagedObject,我不會丟失我的類中的代碼。給我增加的功能,如計算字段或轉換方法,無需子類。如果您不需要特定實例的這些方法,則只需排除對類別的引用即可。

子類化永遠不會壞但IMO。

4

我不能告訴你有關共識,但這裏是我的意見:

子類UIView只有當...

  • 你想要做自定義繪製
  • 您需要定製一些已存在的行爲UIView子類
  • 您對佈局子視圖有特殊需求。不過,大多數佈局可以通過UIViewController完成。
  • 也許對於特殊的觸摸操控,你不能用手勢識別

子類UIViewController在所有其他情況下進行。無論如何,您幾乎總是需要控制器來編寫將視圖和模型連接在一起的膠水代碼,或者用於處理用戶交互。因此,Apple已經使UIKit輕鬆讓控制器完成所有工作,並儘可能保持視圖「愚蠢」。例如,嵌套控制器以創建複雜的視圖層次結構非常簡單,而不需要擁有單個視圖子類。

一個指示器,子類化UIView不是應該做的第一件事是在UIView class reference中標題爲「子類別的替代方法」一節。 UIViewController的子類化的一個指標是,UIViewController class reference中沒有這樣的部分:-)

+0

真棒迴應,謝謝! –

+0

@herzbube你認爲這就是爲什麼我們現在有在IB的兒童VC的容器視圖?這是要在場景之間共享UI部分的方式嗎(如個人資料圖片+名稱+狀態點)? – allaire

+0

@allaire評論對討論沒有多大用處,他們也不打算這麼做。您可以在聊天頻道開始討論以獲得意見。話雖如此,我承認1)我從未使用IB很多; 2)我現在已經與iOS開發相隔甚遠了好幾個月,所以我現在還不知道IB給開發者的是什麼,以及蘋果如何認爲它應該被使用。也許看科技視頻或兩個? – herzbube

相關問題