应该停止从 xibs 加载 UIView 吗?

Posted

技术标签:

【中文标题】应该停止从 xibs 加载 UIView 吗?【英文标题】:Should one stop loading UIView from xibs? 【发布时间】:2013-08-02 10:09:11 【问题描述】:

自从ios 5.0 带来了childViewControllers 的概念,它似乎什么都能做,我习惯用UIView 来做,以前是从xib 文件中加载的。

我通常会使用 UIView 并让它包含 xib 文件中的所有其他内容的场景。如果需要实现 UIView 用来加载的任何 Delegate 和 DataSource。

使用这样的东西:

 NSArray* nibsArray = [[NSBundle mainBundle] loadNibNamed:@"ABCustomLoginView" owner:self options:nil];
        if(nibsArray && [nibsArray count] > 0)        
            self = [[nibsArray objectAtIndex:0] retain];
        

这似乎从来都不是正确的,它曾经破坏 MVC。 为什么一个 UIView 会处理另一个 UIView 的事件?

现在有了 childViewController,我是否应该总是制作一个大小合适的 UI 片段,它有自己的功能,以后可以在单独的 UIViewController 中重复使用?

或者在某些情况下,以前的方法仍然占上风?

【问题讨论】:

【参考方案1】:

您应该只在构建自定义容器视图控制器时使用子视图控制器,否则您的布局非常复杂。

现在我的意见是:我总是使用故事板,因为它们允许您在设计时表达整个屏幕,而无需在运行时组装它(如您上面的代码)。

因此,即使您选择为每个单独的视图控制器使用故事板(一些大型团队这样做是为了避免合并问题),您也可以将所有视图和视图控制器布局并连接在一起。

如果您希望在运行时创建某个视图的动态编号,我可能只会对视图进行编码,或者如果它非常复杂,我会将 NSNib 存储在 ivar 中并从中实例化每个视图。

底线:子视图控制器绝不会取代甚至与您的代码示例相关,即您如何使用它。

【讨论】:

我说的是你的屏幕有一个可重复使用的部分,你可以在多个屏幕中重复使用它。它在 iPad 应用程序中很常见。为了在多个地方使用它并避免对其 UI 进行编码,我曾经使用笔尖并将该笔尖加载为 customView 的子视图。在大多数情况下,如果该视图有一个 tableView,customView 将处理 tableView 的委托。在这种情况下,childViewControllers 不是一个完美的选择吗?它类似于android中片段的概念。 我明白了。是的,这是子视图控制器的有效应用程序。您的原始问题是正确的,即视图不应处理其他视图事件,因此在这种情况下,子视图控制器将拥有其视图并处理其事件。 (我仍然会从情节提要加载子视图控制器)。如果您是一个小团队,我会将所有内容放在一个故事板中,并将您的所有子视图容器对象指向“场景”,即您在多个地方使用的子视图控制器。 很好。故事板很好。我不是在争论故事板或 xib。我的论点是在 UIViews 和 childViewControllers 之间进行选择。虽然我还没有在项目中使用故事板,但我担心如果多个人试图弄乱故事板,可能会发生 git 冲突。它只是整个项目的一个文件。对 ?即使我们将其分解为多个故事板,我们也会失去使用故事板本身的目的。 不,即使您为每个视图控制器使用不同的故事板,故事板也比 xib 有很多优势。大多数人将他们的应用程序分成几个故事板,一个用于应用程序的每个逻辑部分,例如设置。我提出故事板的原因是因为您在询问正确的 MVC 分离,故事板对此有所帮助。我还确认在所描述的场景中使用子视图控制器确实比由父视图管理事件的子视图更合适。 当然。我一定会尝试使用故事板。

以上是关于应该停止从 xibs 加载 UIView 吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 .xib 加载自定义视图不适合 iPhone 6+

我可以为一个视图创建 2 个 XIB 吗?

从 Textfield.inputview 加载 xib UIView

对于直接从 Xib 加载的 UIView,何时应用 UIView 大小类?

从 XIB 加载 UIView 大小不正确

如何初始化从 xib 加载的 UIView 子类?继承问题