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

我倾向于同意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老式计时器可以提供这方面的历史背景,那么更好地理解我们每天使用的框架将是很好的。

我怀疑它是以这种方式完成的,因此UIViewController可以具有作为控制器的基本function,而不需要任何子类。 例如,如果您只是在导航控制器上推送“Credits”视图,并且视图只有静态文本,则UIViewController创建UIViewController子类。 您可以直接创建一个UIViewController ,并将包含静态文本的nib传递给它。

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

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

它仍然没有解释原始设计背后的历史原因,但至少它们已经做了一些事情来解决这个问题 – 而且,正如Apple经常那样,以非常优雅的方式。