Iphone 如何放置';M';在MVC中使用接口生成器
我同意在中给出的答案,但是如果我使用Interface Builder来设计我的应用程序视图呢 如果不使用应用程序委托,如何从控制器对象中引用模型对象 据我所知,我不能将使用依赖项注入将对模型的引用传递到IB的自定义Init方法Iphone 如何放置';M';在MVC中使用接口生成器,iphone,cocoa-touch,interface-builder,Iphone,Cocoa Touch,Interface Builder,我同意在中给出的答案,但是如果我使用Interface Builder来设计我的应用程序视图呢 如果不使用应用程序委托,如何从控制器对象中引用模型对象 据我所知,我不能将使用依赖项注入将对模型的引用传递到IB的自定义Init方法 原谅我,我觉得我遗漏了一些非常基本的东西。我已经看过了苹果关于IB的文档,但没有找到一个明确的答案。通常您不会直接在IB中接触模型。您可以将视图与控制器连接起来,也可以将控制器的某些属性绑定到视图。然后编写代码(在控制器中)以访问模型。如果愿意,可以使用awakeFro
原谅我,我觉得我遗漏了一些非常基本的东西。我已经看过了苹果关于IB的文档,但没有找到一个明确的答案。通常您不会直接在IB中接触模型。您可以将视图与控制器连接起来,也可以将控制器的某些属性绑定到视图。然后编写代码(在控制器中)以访问模型。如果愿意,可以使用awakeFromNib方法,但也可以在控制器中实现自定义init。InterfaceBuilder表示MVC模式中的V。因此,您不会使用在IB中创建的任何东西来操作您的模型。您将在IB创建的nib和模型之间使用某种委托。该代理在MVC中代表C,可以与用户界面以及底层模型进行对话 您的参考文章是一篇很好的文章-像您一样,我喜欢将模型注入控制器(这是Smalltalk时代的一个老习惯-特别是Dolphin Smalltalk非常广泛地遵循这种模式) 我发现我的大多数控制器都有如下init方法:
- (id)initWithItem:(id<Nameable>)item addingTo: (id<ModelContainer>)model {
if (self = [self initWithNibName:@"ItemEditTableToolbarView" bundle:nil]) {
self.namedItem = item;
self.container = model;
}
return self;
}
请注意,我在init方法中嵌入了我的Nib文件的名称(如果您需要更大的灵活性,您可以使用另一个参数-但我还没有发现我的任何控制器需要通用。这很有趣-在Dolphin中,控制器(及其视图)可以是非常组合的-通常在你的init方法中,你会从你的模型中挑选出子模型,并为你的子组件调用init
但是您需要做一些额外的工作才能将模型传递给第一个控制器(这是我最初没有想到的)
- (id)initWithItem:(id<Nameable>)item addingTo: (id<ModelContainer>)model {
if (self = [self initWithNibName:@"ItemEditTableToolbarView" bundle:nil]) {
self.namedItem = item;
self.container = model;
}
return self;
}
viewController=[[ApprotViewController alloc]initWithModel:[应用程序模型]];
viewController.view.frame=[[UIScreen mainScreen]applicationFrame]
[窗口添加子视图:viewController.view]
[WindowMakeKeyandVisible]- (id)initWithItem:(id<Nameable>)item addingTo: (id<ModelContainer>)model {
if (self = [self initWithNibName:@"ItemEditTableToolbarView" bundle:nil]) {
self.namedItem = item;
self.container = model;
}
return self;
}
窗口=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]边界]]
viewController=[[ApprotViewController alloc]initWithModel:[应用程序模型]];
viewController.view.frame=[[UIScreen mainScreen]applicationFrame]
[窗口添加子视图:viewController.view]
[WindowMakeKeyandVisible]- (MyModel *)model;
然后,您可以从应用程序(如上面所示)以及应用程序中的其他位置获取模型,例如
viewModel = [[UIApplication sharedApplication] model];
尽管如我所述,如果总是将其传递到视图控制器中,这可能是一种代码味道。如何在XIB控制器和模型对象之间添加委托?如何获得控制器对象实例的引用?谢谢Tim。这是最好的答案,但正如你所说,不是100%棒!消息ems表示,认真的开发人员不使用IB-这肯定是不对的?我有一种预感,有一种方法可以在代码中进行一些初始启动,这样您也可以使用代码启动第一个控制器。我有一些示例要尝试,并将向您报告。认真的开发人员肯定使用IB。正如回答的那样,这只是根的问题应用程序的视图控制器,而不是所有的视图控制器。您仍然可以在IB中布置由每个特定视图控制器管理的所有内容。