2010-11-14 40 views
4

我已阅读Apple的“您的第一个iOS应用程序”指南,所有内容对我来说似乎都很清楚。但是,当我尝试了解XCode中提供的基于View的iOS应用程序模板的工作原理时,我遇到了一些有趣的难题。基于视图的iOS应用程序模板

据我所知,应用程序从主要的nib文件名(通常是MainWindow.xib)形成* -Info.plist文件。我不明白的是,默认情况下,XCode如何知道哪个nib文件与使用此基于View的应用程序模板创建的控制器相关联。在指南中,你开始与基于Windows的应用程序,你“必须写”是这样的:

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

[self setMyViewController:aViewController]; 

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

回答

6

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

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

您还会看到它有一个名为'viewController'的插座。这附加到称为'[project name] View Controller'的xib中的另一个对象。检查类型,你会发现它是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。如果你想要的话,甚至可以向用户询问(尽管出于安全原因它会是一个非常糟糕的主意)。

+0

整个过程的优秀解释,竖起大拇指。 – 2010-11-15 03:29:19

+0

嗯,你完全正确地从他们的名字实例化类,但那不是我所问的。你在这里说的:“这样做会打开另一个xib并继续执行相同的步骤。”似乎没有回答我的问题:如何解决NibTestViewController控制器的nib文件是非常NibTestViewController.xib文件?换言之,如何知道在这种情况下甚至应该有用于加载的nib文件(因为我们可以清楚地实例化没有nib文件的控制器)? – itim 2010-11-15 06:56:14

+0

“...查看其属性(检查器中的第一个选项卡,带有滑块图形),您还会看到单独的nib文件被指定为包含其主要细节。” - 对不起,我真的很累读这个。这个答案实际上是指甲,非常感谢你! – itim 2010-11-15 09:21:56

相关问题