【问题标题】:Does styling UI objects in iOS violate MVC?iOS 中的 UI 对象样式是否违反 MVC?
【发布时间】:2013-07-08 17:19:16
【问题描述】:

我对 MVC 和 iOS 开发有些陌生,我似乎无法协调 UI 样式如何适应这种范式。

我的 MVC 视图是使用故事板构建的,我可以通过 Xcode 的属性检查器应用原始样式,但任何更复杂的事情我都必须使用控制器来设置样式。例如:

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated]; // required

    // set background color of view
    [[self view] setBackgroundColor:[UIColor darkGrayColor]];
}

这似乎明显违反了 MVC,因为我在控制器代码中应用了样式逻辑。我发现这类似于编写 HTML 应用程序,而不是使用样式表,而是编写代码以在 JavaScript 中本地应用样式。这是 iOS 的弱点还是我做错了?

【问题讨论】:

  • 您可以在代码中混合和匹配这两者。如果你愿意,你甚至可以在控制器中操作模型细节。 MVC 在该模式的一般准则中并未严格执行,但如果您想忠于该范例,您只需避免在 C 中使用 M 或 V。
  • 有人可能会说风格是一种数据形式。由于控制器通常为视图提供数据,因此让控制器为视图提供样式是类似的。

标签: ios model-view-controller ios6 uiviewcontroller


【解决方案1】:

取自Apple's docs:

一些控制器对象也可能告诉视图对象改变一个 它的外观或行为方面

这确实有意义,因为视图应该是被动的,并且仅将应用程序状态反映为 UI,如果需要根据用户操作更改其某些内容,控制器将“告诉”视图。 (例如背景变化、控件的可见性等...)

【讨论】:

  • 但在这种情况下,我只是设计静态按钮、标签等的外观。与响应用户操作或模型更改无关。我认为 iOS 可能缺少 CSS 的等价物。
  • 必须在某处创建视图,因为视图不会调用它自己的创建。尽管 Interface Builder 确实对您隐藏了大部分内容,但这并不意味着它不会以相同的方式创建视图
【解决方案2】:

实际上屏幕是您的“视图”,您的“控制器”正在向您的视图发送一条消息,以使用不同的颜色作为背景。

如果您有一个保存屏幕颜色的数据对象,那可能就是您的“模型”。在这种情况下,您将通过控制器将数据从模型传递到视图。

【讨论】:

    【解决方案3】:

    您可以在代码中混合和匹配这两者。如果你愿意,你甚至可以在控制器中操作模型细节。 MVC 在模式的一般准则中并未严格执行,但如果您想忠于范式,您只需避免在 C 中使用 M 或 V。

    视图需要表单的修饰和美学以及样式,但最重要的是,您可以从控制器操作这些方面...

    【讨论】:

      【解决方案4】:

      正如其他人所说,如果您将颜色和样式理解为数据,则可以让控制器处理它。

      但您也可以继承 UIviews 并在内部设置样式。

      假设您有一个TrafficLightView : UIView 和一个属性id trafficLight。您可以覆盖设置器并根据对象的状态设置视图的背景颜色。 trafficLight.

      【讨论】:

        猜你喜欢
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 2013-07-22
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多