【问题标题】:Protocol, delegate and datasource on iOSiOS 上的协议、委托和数据源
【发布时间】:2012-03-01 19:59:53
【问题描述】:

Model View Controller 政策规定视图不能拥有数据,并且应该使用委托从 ViewController 请求数据。

但是例如 UILabel 呢?控制器直接与 Outlet 对话,例如:

self.textfield.text=@"显示此文本"。 (这里没有delegate?UILabel也是一种视图?)

【问题讨论】:

标签: iphone ios delegates protocols


【解决方案1】:

对于像在 UILabel 中设置文本这样简单的事情,委托会变得不必要地复杂。

使用 UILabel 破坏 MVC 的一个示例是使用它的 text 属性作为应用中其他地方使用的一段数据的唯一存储。例如,如果应用程序涉及到一个人的姓名和其他信息,这些信息与 UILabel 一起显示,那么您很可能应该将 Person 类作为模型的一部分,而不是使用 UILabel 作为该信息的专有存储。

【讨论】:

  • 尽管如此,重要的一点是,视图拥有一份数据的副本或引用是可以的,但视图不应该关心数据来自哪里,它意味着什么等等。 UILabel 是非常可重用的,因为它不担心那些事情;你给它一个字符串,它会显示那个字符串,直到有人告诉它显示一个不同的字符串。
  • @Caleb 那么为什么 UIPickerView 使用数据源来表示组件的数量呢?当然,组件的数量可以是一份数据的副本或引用,而不在乎它来自哪里。
  • @Ant 我想说的是,使用数据源的全部意义在于选择器不关心数据的来源。您给选择器一个数据源——any 数据源——它知道如何要求该对象显示要显示的项目。将数据源用于选择器而不用于标签的决定只是设计问题——您真的希望必须为每个标签设置数据源吗? OTOH,您是否希望每次更改单个项目时都必须将大量数据发送到您的选择器?他们就是这样,因为它是有意义的 w.r.t.它们是如何使用的。
  • @Caleb。我明白了,谢谢你。我还没有意识到能够使用 any 数据源的意义。我几乎得出结论,选择器数据不太可能在控件的生命周期内发生变化,而标签更有可能发生变化。我没有考虑所涉及的数量数据。我很想听听您对前者的看法。
  • @Ant 我想这取决于你如何使用它。选择器很像一张表格——它背后的数据可能会改变也可能不会改变,这取决于你如何使用它。无论哪种方式,控件本身只需要在任何给定时刻实际显示的数据,因此每当用户移动其中一个选择轮(或滚动表格)时,控件所需的数据都会发生变化。但是 FWIW,更改选择器的内容是很常见的。例如,选择最左侧列中的一项可能会导致其他列完全重新填充。
【解决方案2】:

这基本上意味着UILabel 不应该修改提供要显示的文本的基础数据。控制器也是如此,它只能充当数据到视图的桥梁。

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    相关资源
    最近更新 更多