iphone – 基于视图的iOS应用程序模板
我已经阅读了Apple的“你的第一个iOS应用程序”指南,我所看到的一切似乎都很清晰.但是,当我试图理解XCode中提供的基于视图的iOS应用程序模板如何工作时,我遇到了一些有趣的难题.
我知道应用程序获取主要的nib文件名(通常是MainWindow.xib)形成* -Info.plist文件.我不明白的是,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在我背后做了什么魔术,当时我认为我只是选择一个简单的代码模板. 解决方法
如果查看目标信息(双击目标以显示它),“属性”选项卡将显示主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.如果你愿意的话,甚至可以询问用户(尽管出于安全原因这是一个非常糟糕的主意). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |