0

我對視圖和視圖控制器的職責感到困惑。如何有效地使用MVC體系結構

我已閱讀Apple's Doc on MVC,但沒有說明任何明確的例子來回答我的問題。

我有一個簡單的數據庫應用程序,它從數據庫中提取數據並使用UITableView顯示它。

我的視圖是自定義視圖。它基本上是一個UITableView的集合,顯示在UIView中彼此相鄰的顯示從數據庫計算出的數據。

我的看法控制器爲每個UITableview實現委託。

我有一個容器視圖(UIView的),其中包含它 的viewController內的所有的UITableView:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: 
(NSIndexPath *)indexPath 
{ 

    UIView *containerForAllview = [tableview superview]; 
    //container view contains list of dataset . each of which is displayed 
    // by it's own respective tableview 

    if(tableview = atableview){ 
     array = containerForAllview.getDatafortable(atableview); 


    }else if(tableview = btableview){ 
    array = containerForAllview.getDatafortable(btableview); 
    } 
    /// like this for few more tables 

    // configure cells using this array 
    cell.text = [array objectAtIndex:indexpath.row].name; 
} 

我覺得什麼是有鬼我的設計。

  1. 視圖控制器是否需要知道我的整個視圖層次結構。最初我以爲我的ContainerView會抽象一切。
  2. (其責任是處理用戶事件)tableview的委託應該由containerView或我的viewcontroller實現。
  3. 如果我的視圖處理事件,那麼我的UIViews需要引用我的數據模型,這違反了MVC體系結構的概念。
  4. 是不是我的容器視圖持有列表的數組來提供它的tableviews或我應該將該邏輯移動到視圖控制器?
+0

對我來說聽起來好像你的模型只是另一個(數據庫)控制器。模型將是一個類,它擁有數據庫中的一條記錄。 – vikingosegundo 2012-07-13 22:49:49

+0

我的模型是一個核心數據對象 – 2012-07-13 22:50:36

+0

比你的措辭比較模糊。 – vikingosegundo 2012-07-13 22:51:16

回答

1

視圖控制器應該負責管理它下面的整個視圖層次結構。視圖只管理事件,只要他們知道它們何時發生以及向誰通知。他們很少對此做任何事情。他們只是通知他們的事件代表(通常是他們自己的視圖控制器)。通常,只有您的viewControllers(它們是控制器)直接與您的模型對話,並告訴視圖他們需要知道什麼,並對視圖的有關UI事件的通知做出響應。

具體對策:

  1. 是,ViewControllers因爲你需要他們,他們管理整個層次的如知道。
  2. viewController處理委託方法,而不是視圖。
  3. 沒有,他們只是告訴VC的事件發生(通過委託,而不是通過知道任何關於他們的VC專門除了VC告訴視圖(通過各種機制)來調用哪個方法在什麼情況下。
1

修改設計以遵循MVC體系結構的簡單方法是爲每個表單獨創建一個數據類。

你可以做些什麼TableA有一個數據源和委託TableAData - 這是一個完全獨立的類。那麼你只需要確保TableAData聲明一個協議,這樣TableA就可以監聽來自TableAData的代理方法並相應地修改它的顯示!

MVC架構非常簡單 - 讓另一個類來處理所有數據處理。一旦這個類處理了數據,通知視圖控制器,以便它可以更新用戶界面!這是通過委託或通知來完成的,例如鍵值觀察。