gpt4 book ai didi

iphone - 基于 View 的 iOS 应用程序模板

转载 作者:可可西里 更新时间:2023-11-01 05:32:16 26 4
gpt4 key购买 nike

我已经阅读了 Apple 的“您的第一个 iOS 应用程序”指南,其中的一切对我来说似乎都非常清楚。然而,当我试图了解 XCode 中提供的基于 View 的 iOS 应用程序模板如何工作时,我遇到了一些有趣的难题。

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

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

[self setMyViewController:aViewController];

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

最佳答案

如果您查看目标信息(双击目标将其调出),“属性”选项卡您将看到主 Nib 文件的名称。出于这些目的,“Nib”和“Xib”这两个词可以互换; Xib 只是 Nib 的更新替代品。

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

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

为了论证,假设我将我的项目命名为“NibTest”并且没有进行任何更改。

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

然后它将从 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。如果您愿意,甚至可以询问用户(尽管出于安全原因,这是一个非常糟糕的主意)。

关于iphone - 基于 View 的 iOS 应用程序模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4180463/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com