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

时间:2010-11-14 23:54:55

标签: iphone ios xcode interface-builder xcode-template

我已经阅读了Apple的“您的第一个iOS应用程序”指南,我所看到的一切似乎都很清晰。但是,当我试图理解XCode中提供的基于视图的iOS应用程序模板如何工作时,我遇到了一些有趣的难题。

据我所知,应用程序从* -Info.plist文件中获取主nib文件名(通常是MainWindow.xib)。我不明白的是,XCode如何知道哪个nib文件与默认情况下使用此基于View的应用程序模板创建的控制器相关联。在本指南中,您将从基于Window的应用程序开始,并且“必须编写”类似于:

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

[self setMyViewController:aViewController];

这非常有意义。然而,事实证明,在基于视图的iOS应用程序模板中没有这样的东西,并且首先实际上并不需要这个nib规范,只要您创建了带有选项“With XIB for user interface”的UIViewController子类“检查。我的问题是,XCode如何知道哪个nib与此控制器相关联,即它是将此连接存储在某些文件中,还是通过某种约定(控制器和nib文件的名称可能相同)?此外,'加载来自MyViewBasedAppController''副标题来自于MainWindow.xib中接口构建器的控制器视图?当我手动添加控制器时,它肯定不存在,所以我很好奇XCode在我背后做了什么魔术,当时我认为我只是选择一个简单的代码模板。

1 个答案:

答案 0 :(得分:6)

如果您查看目标信息(双击目标以显示它),“属性”选项卡将显示主Nib文件的名称。 “Nib”和“Xib”这两个词可以互换用于这些目的; Xib只是Nib的新选择。

这将是'MainWindow'新鲜的模板。如果您打开MainWindow.xib,您会看到有一个名为'[project name] App Delegate'的对象,如果您显示检查器并在'i'选项卡下检查,您将看到类的类型在顶部命名。如果检查连接选项卡(右箭头),您将看到文件所有者(UIApplication本身)附加了“委托”属性。

你还会看到它有一个名为'viewController'的插座。这附加到xib中另一个名为“[project name] View Controller”的对象。检查其上的类型,您将看到它是Xcode添加到项目中的视图控制器的类型。查看其属性(检查器中的第一个选项卡,使用滑块图形),您还会看到单独的nib文件被指定为包含其主要详细信息。

为了论证,假设我调用了我的项目'NibTest'而没有做任何更改。

在运行时,设备加载Info.plist。在那里它看到委托是NibTestAppDelegate类型。因此,它将实例化NibTestAppDelegate类的实例,并将UIApplication的委托属性设置为它。

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

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

Objective-C具有完全反射的运行时,因此您可以在运行时通过其类名实例化对象。例如,这是Objective-C和C ++之间的差异之一。

Xcode不会生成任何隐藏代码或依赖任何隐藏的命名约定。整个过程由操作系统在运行时计算出来。

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

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

你实际上可以这样做:

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

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

您也可以将您喜欢的任何其他字符串对象传递给NSClassFromString。如果你愿意的话,甚至可以询问用户(虽然出于安全原因这是一个非常糟糕的主意)。