UIViewController 的 initWithNibName:这个设计背后的原因?

Posted

技术标签:

【中文标题】UIViewController 的 initWithNibName:这个设计背后的原因?【英文标题】:UIViewController's initWithNibName: a reason behind this design? 【发布时间】:2012-01-23 18:43:00 【问题描述】:

我倾向于同意 Joe Conway 和 Aaron Hillegass 的分析,正如 Ole Begemann 今天在 http://oleb.net/blog/2012/01/initWithNibName-bundle-breaks-encapsulation/ 中所报道的那样

基本上,他们声明 NIB 的文件名是相应 UIViewController 类的实现细节,调用类的业务不是在 init 方法中传递 NIB 的文件名。

我想知道 AppKit/UIKit 的创建者选择这种设计是否有任何特别的原因,或者这仅仅是一个错误——在后一种情况下,为什么 UIKit 出现时没有纠正它,这将是一个很好的机会。

如果有任何 Objective-C 的老前辈可以提供这方面的历史背景,那将有助于更好地了解我们每天使用的框架。

【问题讨论】:

顺便说一句——如果你通过nil作为nib名称,控制器将从与类本身同名的Nib中加载,如果它存在的话...... 当然。这很方便,但从原理上讲,封装似乎还是被设计破坏了。 【参考方案1】:

我怀疑这样做是为了让UIViewController 可以具有作为控制器的基本功能,而无需任何子类化。例如,如果您只是在导航控制器上推送“Credits”视图,而该视图只有静态文本,您可以不创建 UIViewController 子类而侥幸。您可以直接创建一个 UIViewController 并将包含静态文本的 nib 传递给它。

当然,大多数时候,您都希望与呈现的内容进行某种程度的交互,在这种情况下,自定义控制器是必要的。但理论上,它并不总是必需的。

【讨论】:

我已经想到了。但是,它仍然没有回答为什么在每个 Apple 示例代码和 Xcode 模板中,NIB 名称是在调用 VC 而不是实现 VC 中指定的 :) 是的,我认为这只是其中一个人做过一次,然后其他人都模仿的事情。【参考方案2】:

今天我想到,也许故事板正是对这个问题的回应。因为 Storyboard 是在应用程序级别定义的,所以不再违反封装,只是级别的变化。 UIViewController 子类成为整个 Storyboard 的详细实现。

它仍然没有解释原始设计背后的历史原因,但至少他们已经采取了一些措施来解决这个问题——而且和 Apple 一样,以一种非常优雅的方式。

【讨论】:

以上是关于UIViewController 的 initWithNibName:这个设计背后的原因?的主要内容,如果未能解决你的问题,请参考以下文章

从超级视图中删除视图时出错

MPMoviePlayerViewController 隐藏状态栏

swift

Attributes:文本属性 和NSAttributedString

用原始NSString对象排序NSArray

同一段文字设置不同的颜色和字号字体