2011-01-13 89 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)中,每个组件都有一个视图和一个控制器(并不总是一个模型)。