6

背景:直到 Xcode 4.2,使用任何模板创建的新项目都将包含 MainWindow.xib,因此将 nil 作为 UIApplicationMain() 的第四个参数传递。从 Xcode 4.2 开始,所有模板都通过将类字符串作为第四个参数传递来实例化应用程序委托,并且不在 xib 中构建应用程序的窗口。

在 4.2 中完成这个设置是微不足道的,当然它按预期工作:创建 xib 设置文件的所有者到 UIApplication 并连接委托,在 Info.plist 中指定它,在 main() 中没有第四个参数。

问题:为什么 Apple 现在鼓励实例化应用程序委托并在代码中构建 UIWindow 而不是“旧方式”?有什么好处?

注意事项:如果您选择使用故事板作为管理 UI 的一种方式,我会期待这种新的模板行为,但如果您取消选中“使用故事板”,我会期待旧的 pass-nil-and-use-MainWindow.xib 模板。

这个问题是在这里以迂回的方式提出的,但是在讨论中答案有点薄。

4

1 回答 1

7

你问苹果为什么要这么做?除非苹果明确表态,否则没有明确的答案,而他们没有这样做。

就我个人而言,我发现新方法更加优雅、透明和防弹。正如您所说的那样,在旧方法中,主 nib 由运行时自动加载以响应 Info.plist 设置,并且发生的所有其他事情都是通过 nib 完成的,特别是应用程序委托和窗口的实例化相关的接线(应用程序委托必须成为应用程序委托,窗口必须成为应用程序委托的窗口),除了然后我们回到应用程序委托中的代码以进行界面的最终呈现。

这很难理解。我在我的书中用了大量的措辞来描述它。它也很容易坏掉。nib 必须知道应用程序委托类的名称,因此,如果您不喜欢默认创建的那些有趣的长名称,那么当您更改它们时,您很容易搞砸一切。

然而,现在,应用程序委托被简单地命名为 App Delegate,并由 UIApplicationMain() 在代码中实例化,正如您所说的那样;其他所有事情在代码中作为直接后续操作完成:应用程序委托被实例化并调用 didFinishLaunching,然后我们在代码中创建窗口,将其分配给代码中的属性,如果代码中有一个,则加载 nib ,在代码中设置窗口的rootViewController,和之前一样在代码中显示界面。

因此,引导直接暴露给视图,因为它都是代码。这使得在不破坏任何东西的情况下更容易理解和修改。就好像以前模板设计者只是在炫耀有多少东西可以在幕后神奇地自动发生;现在一切都在公开、明确地发生。

于 2011-10-25T18:46:01.940 回答