背景:在Xcode 4.2之前,使用任何模板创建的新项目都包含MainWindow.xib,因此将nil作为UIApplicationMain()的第四个参数传递。从Xcode 4.2开始,所有模板都通过将类字符串作为第四个参数传递来实例化应用程序委托,而不是在xib中构建应用程序的窗口。
在4.2中完成此设置是微不足道的,当然它按预期工作:创建xib设置文件的所有者到UIApplication并连接委托,在Info.plist中指定它,在main()中指定第四个参数。< / p>
问题:为什么Apple鼓励实例化应用程序委托并在代码中构建UIWindow而不是“旧方法”?有什么好处?
注意事项:如果您选择使用故事板作为管理用户界面的方式,我会期待这种新的模板行为,但如果您取消选中“使用故事板”,我会期望旧的密码-and-use-MainWindow.xib模板。
这个问题是以迂回的方式here提出的,但讨论的答案有点薄弱。
答案 0 :(得分:7)
你在问苹果为什么要做某事?除非Apple明确说出来,否则就没有明确的答案。
就个人而言,我发现新方法更加优雅,透明和防弹。正如您所说,在旧方法中,主nib由运行时自动加载以响应Info.plist设置,并且所有其他事件都是通过nib完成的,特别是应用程序委托和窗口的实例化。相关的布线(应用程序委托必须成为应用程序委托,窗口必须成为应用程序委托的窗口),除此之外我们回到应用程序委托中的代码以进行接口的最终呈现。
这很难理解;在我的书中描述它需要大量的措辞。这也很容易打破。 nib必须知道app delegate类的名称,所以如果你不喜欢默认创建的那些有趣的长名字,你可能会在更改它们时轻易搞砸所有内容。
然而,现在,app委托简单地命名为App Delegate,并且由UIApplicationMain()代码实例化,正如你所说的那样;并且 else 的所有内容也在代码中作为直接后续内容完成:app委托实例化并调用didFinishLaunching,然后我们在代码中创建窗口,将其分配给我们在代码中的属性,如果代码中有一个,则加载nib,在代码中设置窗口的rootViewController,并像以前一样在代码中显示接口。
因此,引导直接暴露给视图,因为它是所有代码。这使得更容易理解和修改而不会破坏任何东西。这几乎就像以前的模板设计师只是在炫耀可以在幕后神奇地自动发生多少东西;现在一切都在公开,明确地发生。