2010-07-21 157 views
6

我目前有一個簡單的iPhone應用程序加載UIView的自定義子類。目前在整個應用程序中只有一個控制器,儘管有幾個UIView用於邏輯分離程序。自定義UIView和UIViewController最佳實踐?

我目前的結構看起來是這樣的:

mainView : UIScrollView 
    \__ has one subView : myCustomUIView : UIView 
      \__ has many subSubView : myOtherCustomUIView : UIView 

我希望這是明確的;當然,冒號代表繼承。

我的問題是這樣的:我需要攔截最低級別的事件subSubView。我可以在應用程序控制器中做到這一點,如果我需要,但我應該有一個subSubViewController?我應該有一個subViewController嗎?

如果是這樣,有人可以指點一些手工操作嗎?我當然可以創建這些類,但將它們連接到自定義視圖似乎並不重要。除了保存窗口對象的主要筆尖外,我沒有使用界面構建器。

我的主要困惑來自當我將視圖嵌套在具有不同控制器的視圖中時會發生什麼。假設我有一個subSubViewController,但mainView仍然有它的mainViewController。由於subSubView包含在mainView中,這不會導致一些問題嗎?

我應該使用代表完成這一切嗎?

任何在正確的方向微調將不勝感激。

回答

10

視圖和視圖控制器成對存在。每個視圖控制器控制視圖和視圖的子視圖。這是必要的,因爲視圖控制器在事件響應鏈中。如果多個視圖控制器在同一視圖中處於活動狀態,則響應器鏈將變爲混亂狀態。

標準視圖控制器沒有subController屬性,並且不知道另一個控制器是否在同一個鏈中處於活動狀態。導航和標籤欄控制器的存在正是爲了處理層次控制器。但是,他們通過交換一個視圖/視圖 - 控制器對來實現。您不能使用導航或標籤欄控制器爲子視圖提供不同的控制器。

因此,無論您有多少個子視圖可供任何人查看,您最終只會在每個屏幕上顯示一個控制器。

你可能想重新考慮你的設計。如果每個子視圖都需要高度可定製的行爲,那麼您可能希望將它們移動到控制器層次結構中的各個視圖中,例如在主從設計模式中。

如果你必須在同一個屏幕上有所有的子視圖,那麼我會建議看看UITableView和UITableViewController是如何處理的。 (您可能只能使用修改後的tableview。)tableview是一個滾動視圖,它包含單元格,節標題,頁眉和頁腳的多個子視圖。它通過捕獲來自tableview的觸摸並確定觸摸哪個單元格視圖然後採取適當的操作來管理這一點。

如果您需要每個子視圖的高度自定義行爲,則可以使用委託模式併爲每個子視圖分配一個不同的委託對象。該觀點可能會陷入其自身的觸動,並稱其爲自己的代表。

滾動視圖實現自定義觸摸行爲可能會很棘手,因爲scrollview陷阱觸及的層次高於其他視圖,因此它可以確定是否需要滾動。

+0

正是我需要知道的,謝謝。 – 2010-07-21 16:55:42