Xcode 4.2 模板更改 - UIApplication & MainWindow.xib

Posted

技术标签:

【中文标题】Xcode 4.2 模板更改 - UIApplication & MainWindow.xib【英文标题】:Xcode 4.2 Template Changes - UIApplication & MainWindow.xib 【发布时间】:2011-10-21 12:46:00 【问题描述】:

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

在 4.2 中完成这个设置很简单,当然它可以按预期工作:创建 xib 设置 File's Owner 到 UIApplication 并连接委托,在 Info.plist 中指定它,在 main() 中没有第四个参数。

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

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

这个问题是以迂回的方式被问到here,但在讨论中答案有点薄。

【问题讨论】:

感谢有关设置文件所有者和连接代理的提示;鉴于 Apple 对工具进行了快速的更改,我在阅读一本只有 12 个月大而且相当过时的书时遇到了麻烦。 【参考方案1】:

你问苹果为什么要这么做?除非苹果明确表态,否则不可能有明确的答案。

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

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

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

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

【讨论】:

可以说模板文件是“好”或“坏”,但一般来说,Apple 不会在没有仔细考虑的情况下将某些内容放入模板中。他们很清楚模板为社区树立了榜样,在这种特殊情况下,这是一个很大的变化。虽然您似乎对代码和 IB 有个人亲和力,但我不确定这是否完全解释了更改模板的决定(当然可能 - 您提到了一个有趣的点,即必须从代码中调用 keyAndMakeVisible)。跨度> 我完全不同意。模板的深思熟虑非常糟糕,尤其是考虑到它们的重要性。 Xcode 4 中的拆分视图模板包含一个巨大的错误,如果在纵向时内存不足,则会暴露该错误。 Xcode 4.2 中的实用程序应用程序模板将 FlipsideViewController 的委托属性无缘无故地错误地声明为 IBOutlet。 Xcode 4.2 中的空应用程序模板,如果按原样使用,会导致运行时警告!我可以继续下去。模板无论如何都不是福音。它们更像是“提供建议”。 你有很多我没有考虑过的其他模板文件的有效点。我(天真地)推测与以前版本的模板相比如此重大的变化必须是因为合理的推理而不是粗心。我认为最可能的原因是 IB(新)使用弱出口的默认行为发生了变化。 我不明白这与它有什么关系。弱插座生成与模板无关。它与ARC有关。如果视图包含在视图层次结构中,则插座没有理由保留它。如果视图卸载并且指向的视图不再存在,则指针不会悬空,因为美妙的 ARC 将其设置为 nil。 (在 ARC 之前,您可能会得到一个悬空指针,因此在这种情况下可能会崩溃。) 抱歉,请允许我澄清一下...我认为保留模板原样可能会使阅读有关新 IB 出口行为的文档的人感到困惑。他们会准确地阅读您所拼写的内容,但随后会看到 Apple 的模板不遵循该模式(文件所有者需要保留 App Delegate 和 Window 出口)。但是,正如您之前指出的,并非所有模板文件都能减少混淆!

以上是关于Xcode 4.2 模板更改 - UIApplication & MainWindow.xib的主要内容,如果未能解决你的问题,请参考以下文章

XCode 4.2 MainStoryBoard 未找到

更改 Xcode 项目模板

UITabBarItem 执行 IBAction Xcode 4.2

Xcode 更改/删除评论模板

如何在 Xcode 4.0.2 中使用 iOS SDK 4.2

Xcode SDK IOS 4.2 安装和构建设置中缺少 iOS 4.1