2011-01-13 86 views
5

那麼,「沒有得到它」太苛刻了;我已經在爲我的邏輯設置工作了,但它似乎並不是iOS認爲合乎邏輯的東西。所以我沒有得到什麼。iOS佈局;我不明白

假設我有一個顯示兩條信息的應用程序;一個日期和一張桌子。根據MVC的方法,我有三個MVC在這裏工作,一個是日期,一個是桌子,一個是將這兩個MCV組合起來,並將它們組裝成一個屏幕,然後將它們連接起來。

主MVC知道如何/在哪裏想佈局兩個子MVC的。每個細節MVC僅在主MVC指定的範圍內照顧自己的孩子。喜歡的東西:

- (void)loadView { 
    MVC* mvc1 = [[MVC1 alloc] initwithFrame:...] 
    [self.view addSubview:mvc1.view]; 

    MVC* mvc2 = [[MVC2 alloc] initwithFrame:...] 
    [self.view addSubview:mvc2.view]; 
} 

如果上述邏輯(這是對我來說),那麼我會想到的任何MVC類有一個構造函數「initWithFrame」。但是一個MVC不會,只有觀點有這個。

爲什麼?

如何正確佈局嵌套的MVC? (當然,我不是隻有這兩個,但是細節MVC再次具有子MVC。)


感謝所有人的回覆。我將研究提供的鏈接。

讓我試着再次解釋我的問題,希望能夠更清楚地說明問題。請注意,我已經發現我的視圖與iOS不匹配,因爲我不喜歡我的代碼在哪裏。

是的,我調用了一個「MVC」UIViewController,因爲它目前爲我實現了MVC的所有方面;它具有控制器代碼和嵌入式視圖,並且控制器通常也包含並提供數據(所有TableView示例都是這樣實現的)。

MVC可以出現在許多層面;基本上一個UITextField可以(應該)成爲一個MVC;有一種觀點,但也包括控制器邏輯,你不想與其他代碼混合。封裝。例如:Java的Swing JTextField有一個MVC。那麼JTable,JList ......多個MVC模式嵌套在其他MVC中來構建整個屏幕。

這是我所期望的,當一些平臺說它使用MVC模式。所以當我編寫表格時,我創建了一個MVC,並且只發送一個日期作爲參數的loadData消息。它需要自己照顧休息。我有一個可以滑入的Detail MVC;然後我告訴它它需要顯示的對象,並且它需要自己照顧其餘部分。封裝。

所以我有很多UIViewControllers嵌入UIViews。這不是做這件事的方法......

+0

什麼是你正在談論的這個** MVC **對象?你是指UIViewControllers? – 2011-01-13 15:20:04

回答

3

如果我理解你的問題 - 我可能不會,請看我對它的評論 - 我認爲你應用的MVC設計模式過於細化。在您描述的設置中最常見的是,您將擁有一個單一的模型,單個控制器和多個視圖,這些視圖按照.xib文件進行分組/組合。

在Cocoa Touch術語中,您將有一個UIView包含帶有日期和UITableView的UILabel。這些是你的觀點。

您肯定會得到表格數據的模型,可能是一組數據。您的日期數據可能來自其自己的模型,如果它是從某個東西中檢索的日期或計算的日期或其他東西,則這些東西與數據陣列完全分開。如果它與數組數據相關聯 - 它們都從數據庫中提取數據,或者從數組數據計算日期,或者你有什麼 - 那麼你有一個單一的模型。

如果數據全部來自單個模型,那麼單個控制器可能沒問題。即使數據來自多個源/模型,您可能在此設置中只需要/需要一個控制器。 UITableView將有一個UITableViewController,並且同一個控制器可以負責提供你的日期。

總之,模型視圖控制器設計模式不要求有一堆嵌套的模型,視圖和控制器。他們可能是,而且複雜的項目可能需要它。但是,大體上,您將擁有一個與模型和一個或多個視圖關聯的控制器,並且該對象集合可以提供一些功能。

0

TBEE,

我會在這裏發表一個微小的代碼示例,因爲它似乎你沒有真正得到它。

@interface MyView : UIView 

@property (retain) IBOutlet UIButton *button1; 
@property (retain) IBOutlet UIButton *button2; 

@property (assign) bool myData; 

-(IBAction) doButton1:(id)sender; 
-(IBAction) doButton2:(id)sender; 

@end; 

@implementation MyView 

@synthesize button1 = _button1; 
@synthesize button2 = _button2; 
@synthesize myData = _myData; 

// I'm leaving out the initWithNib, viewDidLoad, etc. 

- (IBAction) doButton1:(id)sender 
{ 
    // do something as a result of clicking button1 
    _myData = YES; 
} 

- (IBAction) doButton2:(id)sender 
{ 
    // do something as a result of clicking button2 
    _myData = NO; 
} 

@end 

連接那些在InterfaceBuilder中,你有一個工作的「MVC」。你不需要每個按鈕都有一個全新的UIViewController。 View的一個照顧它。

UITableView和它關聯的視圖更復雜,並且可能需要額外的UIViewController來幫助封裝。我真的不建議通過使用它們開始,但這是一個good tutorial here.它有a lot of images這將告訴你如何在IB和類似的東西連接起來。這是舊的,所以你的XCode可能不像圖像,但它有幫助。

8

另一個潛在的環節是WWDC 2010對MVC的熱烈討論。

http://developer.apple.com/videos/wwdc/2010/

這是會話116 - 模型 - 視圖 - Controllr爲iPhone OS

會議是充滿了對MVC如何工作的實用建議,讓他剔,爲什麼它的好。但它也有很多介紹性內容,可以幫助新來的人理解這個概念。

如果我理解你在Java的Swing類上面的句子,你是在談論響應事件的匿名類?如果是這樣,那些不是「MVC的」,它們就是所謂的「觀察者」,當他們從觀察事件的觀察他們採取一些行動時(通常會向控制器發送消息)。 Cocoa Touch使用Target/Action範例(和授權)來實現這一點。

我也強烈建議你採取馬修和斯蒂芬的建議,並寫一堆代碼。如果你不建立直覺的基礎,那麼詢問正確的問題(這是獲得正確答案所需的大部分內容)是非常困難的。

我真的認爲WWDC 2010的演講會有所幫助。

祝你好運!

0

感謝您的鏈接,我會研究它們。

到目前爲止,我已經將大部分應用程序改寫爲使用視圖而不是viewcontrollers(除了頂級的應用程序之外),並且它開始與可用的layoutSubviews之類的API調用進行匹配。我感到不安,我現在需要做的是:

[tableDataSource loadData:date]; 
[tableView reloadData]; 

凡在我以前的設置我所做的就是:

[tableViewController loadData:date]; 

但顯然這是做它的方式。有一點我不清楚ATM。由於我在我的AppViewController的loadView中構造和佈局視圖,如果方向改變,它們如何獲得中繼。 VC沒有layoutSubviews,所以我應該使用didRotateFromInterfaceOrientation並從那裏重新定位子視圖?

順便說一句,我不混合註冊匿名內部類作爲聽衆(觀察員)。我對編寫Swing組件和JavaFX控件非常有經驗。這可能是罪魁禍首,在Java(FX)中,每個組件都有一個視圖和一個控制器(並不總是一個模型)。