MVC模式控制器在呈现视图和转换状态时的职责和最佳实践

时间:2015-03-14 07:03:21

标签: ios model-view-controller uiviewcontroller architecture

我熟悉MVC的概念,其中我们将信息的建模,表示和处理的关注分开。但是当谈到现实生活中的例子时,它会变得朦胧。

让我们以苹果UITableView为例。假设我们有一个相应的控制器来处理表格(提交的UIView是自定义的,只有一个UITableView,此时作为属性公开)。

UITableView有一个属性backgroundView,当没有要显示的元素时,我想用它来显示一些信息。真正的问题是它应该在哪里补充?

  1. 在自定义视图中创建一个创建视图并显示它的方法(showEmptyTableInfoViewWithMessage:)。
  2. 与第一个示例中一样,只是将UILabel作为属性公开,并制作一个简单的隐藏/显示方法,并处理来自控制器的标签文本属性。
  3. 创建一个自定义UIView,它将公开UILabel。将其分配并将其分配给控制器中的backgroundView属性。
  4. 在控制器中创建UIView具有UILabel条件的backgroundView并将其分配给{{1}}。
  5. 由于所有这些例子都有效,我想知道哪一个是正确的方式(关注/维护方式的最佳分离)。我相信4号是最糟糕的,但这只是我现在的感觉。

    提前感谢您提供有关最佳建筑设计/方法的任何信息。

1 个答案:

答案 0 :(得分:0)

UIView应负责隐藏或显示其子视图并管理其子视图。不应该对自身是否可见负责。这就是它暴露hidden属性的原因 - 所以外人可以这样做。

我个人不喜欢你的四个选择。


我会选择其中一个:

  1. backgroundView已经有了一个视图对象。我们可以创建一个UILabel对象,并将其作为子视图添加到表视图的默认backgroundView中,并添加适当的自动布局约束。这可能最好通过继承UITableView来完成,如果是这样,我不会公开UILabel属性,而是公开一个NSString属性,其setter只是设置标签的文本,并且其getter返回此文本。您可以使用其他一些方法来设置标签的字体和其他一些东西。
  2. 创建UIView的子类,可能称为UIBackgroundView。这将是UIView UILabel(以及您想要的任何其他设置)。它不应该直接暴露标签,但是像以前一样,它应该公开属性,让你设置你可能想要设置的标签的东西,并通过代理进行。然后使用类似这样的工厂方法实例化它:

    vwBackground = [UIBackgroundView backgroundViewWithText:@"Hello World];
    

    然后简单地说:

    tableview.backgroundView = vwBackground;
    

  3. 在您使用的两个选项之间取决于您想要的可重用性级别。

    选项一可能稍好一些,并且在您创建子类后它会保存一些编码,但显然,您只能使用表视图执行此操作。如果您想对UICollectionViewUIScrollViewUIImageView或您可以找到的具有backgroundView属性的任何内容执行相同操作,则您需要为每个人创建类似的子类...但最后,我觉得它更容易使用,更直观。

    但是使用选项2,您可以在任何地方自动使用UIBackgroundView。它只是带有标签的UIView,您可以使用任何其他UIView对象执行任何操作。