代码之家  ›  专栏  ›  技术社区  ›  itim

基于视图的iOS应用程序模板

  •  4
  • itim  · 技术社区  · 14 年前

    我读过苹果的“你的第一个iOS应用程序”指南,那里的一切对我来说都很清楚。然而,当我试图理解XCode中提供的基于视图的iOS应用程序模板是如何工作的时,我遇到了一些有趣的难题。

    我明白,应用程序获得了主NIB文件名(通常是主窗口.XIB),形成*-IFO.PLIST文件。我不明白的是,XCode如何知道哪个nib文件与默认情况下使用这个基于视图的应用程序模板创建的控制器相关联。在指南中,您从基于窗口的应用程序开始,然后“必须编写”如下:

    MyViewController *aViewController = [[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
    
    [self setMyViewController:aViewController];
    

    这完全有道理。然而,事实证明,在基于视图的iOS应用程序模板中并没有这样的东西,而且这个nib规范实际上并不需要,只要您创建的UIViewController子类选中了选项“with XIB for user interface”。我的问题是,XCode如何知道哪个nib与此控制器关联,即它是将此连接存储在某些文件中,还是通过某种约定(控制器和nib文件的名称可能相同)?此外,在“MyVIEWBASED AppController”字幕中加载的内容来自接口生成器在MimWilWO.XIB中的控制器视图。当我手工添加控制器时,它肯定不在那里,所以我很好奇XCode在我背后有什么魔力,当我认为我只是选择一个简单的代码模板时。

    1 回复  |  直到 12 年前
        1
  •  6
  •   Srikar Appalaraju Tonetel    13 年前

    如果您查看目标信息(双击目标以显示该信息),“属性”选项卡,您将看到主Nib文件的名称。“Nib”和“Xib”这两个词在这些方面是可以互换的;Xib只是Nib的一个较新的替代品。

    它将是'主窗口'从模板新鲜。如果你打开主窗口.XB,你会看到有一个对象叫[Project Nosi] AppDeaveTo,如果你显示了检查员并在“i”标签下检查,你会看到在顶部被命名的类的类型。如果您检查connections选项卡(向右箭头),您将看到文件所有者(即UIApplication本身)附加了其“delegate”属性。

    您还将看到它有一个名为“viewController”的插座。它附加到XB中的另一个对象名为[项目名称]视图控制器中。检查上面的类型,您将看到它是Xcode添加到项目中的视图控制器的类型。查看它的属性(inspector中的第一个选项卡,带有滑块图形),您还将看到一个单独的nib文件被指定为包含其主要细节。

    为了论证起见,假设我称我的项目为“NibTest”,并且没有做任何更改。

    在运行时,设备加载Info.plist。在那里可以看到委托的类型是nibetasppdelegate。所以它将实例化类nibetasppdelegate的一个实例,并将UIApplication的delegate属性设置为它。

    然后,它将从MainWindow.nib中看到NibTestAppDelegate有一个名为viewController的成员,其类型为NibTestViewController。因此它将创建一个该实例,并在刚刚创建的nibetestappdelegate实例上设置viewController属性。

    在这样做时,它将打开另一个XIB并继续执行相同的步骤。

    Objective-C有一个完全反射的运行时,因此您可以在运行时按其类名实例化对象。例如,这是ObjuleC和C++之间的区别之一。

    Xcode没有生成任何隐藏代码或依赖于任何隐藏的命名约定。整个过程在运行时由操作系统来解决。

    编辑:例如,代替您的示例:

        MyViewController *aViewController = [[MyViewController alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
    

    你实际上可以:

        MyViewController *aViewController = [[NSClassFromString(@"MyViewController") alloc]
    initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
    

    只要MyViewController存在于程序中或更广泛的运行时,它们就可以操作相同。

    您也可以传递任何其他想要的字符串对象 NSClassFromString . 如果你想的话,甚至可以向用户索要(尽管出于安全考虑,这是一个非常糟糕的主意)。