Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何放置';M';在MVC中使用接口生成器_Iphone_Cocoa Touch_Interface Builder - Fatal编程技术网

Iphone 如何放置';M';在MVC中使用接口生成器

Iphone 如何放置';M';在MVC中使用接口生成器,iphone,cocoa-touch,interface-builder,Iphone,Cocoa Touch,Interface Builder,我同意在中给出的答案,但是如果我使用Interface Builder来设计我的应用程序视图呢 如果不使用应用程序委托,如何从控制器对象中引用模型对象 据我所知,我不能将使用依赖项注入将对模型的引用传递到IB的自定义Init方法 原谅我,我觉得我遗漏了一些非常基本的东西。我已经看过了苹果关于IB的文档,但没有找到一个明确的答案。通常您不会直接在IB中接触模型。您可以将视图与控制器连接起来,也可以将控制器的某些属性绑定到视图。然后编写代码(在控制器中)以访问模型。如果愿意,可以使用awakeFro

我同意在中给出的答案,但是如果我使用Interface Builder来设计我的应用程序视图呢

如果不使用应用程序委托,如何从控制器对象中引用模型对象

据我所知,我不能将使用依赖项注入将对模型的引用传递到IB的自定义Init方法


原谅我,我觉得我遗漏了一些非常基本的东西。我已经看过了苹果关于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

但是您需要做一些额外的工作才能将模型传递给第一个控制器(这是我最初没有想到的)

  • 在XCode中创建一个基于窗口的应用程序(如果您想要基于导航的应用程序,您可以很容易地用代码添加它)
  • 编辑“YourAppDelegate.m”,并将ApplicationIDFinishLaunching:方法更改为以下内容:

    - (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]

  • 如果您想使用另一种项目类型,以下说明似乎也很有效,但需要付出更多的努力(我将其简化为上述内容):

  • 删除MainWindow.xib文件(听起来很激进,但您想自己创建主窗口-您仍然可以使用IB创建所有其他视图)
  • 编辑.plist文件并删除MainWindow.xib条目(通常是最后一项)
  • 编辑main.m文件并更改UIApplicationMain行(将最后一个参数替换为现有应用程序代理的名称)-例如:

    int retVal=UIApplicationMain(argc,argv,nil,@“YourAppDelegate”)

  • 编辑“YourAppDelegate.m”,并将ApplicationIDFinishLaunching:方法更改为以下内容:

    - (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]

  • 我在UIApplication中添加了一个名为:

    - (MyModel *)model;
    
    然后,您可以从应用程序(如上面所示)以及应用程序中的其他位置获取模型,例如

    viewModel = [[UIApplication sharedApplication] model];
    

    尽管如我所述,如果总是将其传递到视图控制器中,这可能是一种代码味道。

    如何在XIB控制器和模型对象之间添加委托?如何获得控制器对象实例的引用?谢谢Tim。这是最好的答案,但正如你所说,不是100%棒!消息ems表示,认真的开发人员不使用IB-这肯定是不对的?我有一种预感,有一种方法可以在代码中进行一些初始启动,这样您也可以使用代码启动第一个控制器。我有一些示例要尝试,并将向您报告。认真的开发人员肯定使用IB。正如回答的那样,这只是根的问题应用程序的视图控制器,而不是所有的视图控制器。您仍然可以在IB中布置由每个特定视图控制器管理的所有内容。