我已经阅读了苹果的“您的第一个iOS应用程序”指南,而那里的一切似乎都清楚了。但是,当我尝试了解Xcode中基于视图的iOS应用程序模板如何工作时,我遇到了一些有趣的难题。

我知道该应用程序获取主笔尖文件名(通常为mainwindow.xib)形式的 *-info.plist文件。我不明白的是,XCode如何知道哪个NIB文件与使用此基于此视图的应用程序模板创建的控制器关联。在指南中,您从基于窗口的应用程序开始,然后“必须写”类似的内容:

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

[self setMyViewController:aViewController];

这是完全合理的。但是,事实证明,在基于视图的iOS应用程序模板中,没有这样的东西,并且只要您创建了带有XIB的XIB for USER界面的UiviewController子类,实际上并不需要此笔尖规范。 “检查了。我的问题是,Xcode如何知道哪个NIB与此控制器关联,即它将此连接存储在某些文件中,或者是通过某种惯例(也许是控制器和NIB文件的同名)?此外,从“ myviewbaseadappcontroller”'字幕从接口构建器的“ mainwindow.xib”中的控制器的视图中加载的'在哪里?当我手工添加控制器时,绝对不存在,所以当我认为我只是选择一个简单的代码模板时,我很好奇Xcode在背后做什么。

有帮助吗?

解决方案

如果您查看目标信息(双击目标以提出该目标),则“属性”选项卡,您将看到主笔尖文件的名称。对于这些目的,“ Nib”和“ Xib”一词可以互换。 XIB只是NIB的新替代方法。

从模板中将是“ MainWindow”的“ MainWindow”。如果您打开mainwindow.xib,您会在其中看到一个名为“ [项目名称]应用程序委托”的对象,如果您显示检查员并在“ I i”选项卡下检查,您会看到类型在顶部命名。如果您选中“连接”选项卡(正确的面向箭头),您会发现文件所有者(这是UiaPplication本身)具有其“委托”属性。

您还会看到它具有一个名为“ ViewController”的插座。它附加到XIB中的另一个对象,称为“ [项目名称]查看控制器”。检查它的类型,您将看到它是Xcode添加到项目中的视图控制器的类型。查看其属性(检查器中的第一个选项卡,带有滑块图形),您还将看到一个单独的笔尖文件指定为包含其主要详细信息。

为了论证的缘故,假设我将我的项目称为“ nibtest”,没有做出任何更改。

在运行时,设备加载info.plist。在那里,它看到代表是nibtestappdelegate类型的。因此,它将实例化nibtestappdelegate类的实例,并将Uiapplication的委托属性设置为其。

然后从mainwindow.nib看到nibtestappdelegate拥有一个名为nibtestViewController类型的viewController的成员。因此,它将创建一个实例,并在其刚刚创建的nibtestappdelegate实例上设置ViewController属性。

为此,它将打开另一个XIB并继续执行相同的步骤。

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

Xcode不会生成任何隐藏的代码或依赖任何隐藏的命名约定。 OS在运行时弄清楚了整个内容。

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

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

您实际上可以做:

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

只要程序中的MyViewController或更宽的运行时,它们将相同的操作。

您可以通过您喜欢的任何其他字符串对象 NSClassFromString. 。甚至询问您是否愿意(尽管出于安全原因,这是一个非常糟糕的主意)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top