0

我有以下设计问题,我希望有人能帮助我解决它:)

我有一个视图控制器,它采用问卷模型实例并使用集合视图呈现此问卷。此问卷模型包含一系列问题模型(每个问题实例是基本问题类的不同子类,具体取决于答案类型,例如:日期问题、布尔问题......)。

集合视图中的每个单元格代表一个问题并包含从 .xib 加载的答案视图,具体取决于答案类型(1 xib = 1 种答案)。答案视图可能包含 UISwitch、UITextField 或任何其他允许用户回答问题的控件。

目前,答案视图根据答案验证规则配置控件(例如,日期问题可能具有根据日期问题模型中的内容配置的 datepicker minimumDate/maximumDate 属性,或文本字段的正确键盘等... )。答案视图也是控件的委托/观察者/目标,当其值发生变化时,视图会在目标对象中设置值(如果需要,使用格式化程序并取决于答案类型)。我认为我在这里已经遇到了问题,我有一个视图在模型中设置一个值而不使用控制器,而不是真正的 MVC 对吗?

现在我的主要问题是:视图控制器应该能够验证值,并根据验证结果在屏幕顶部显示错误标签,并取消隐藏错误图标。但是我怎样才能让我的视图控制器通知值更改?而且我还需要检索关联的答案视图实例以显示错误图标(无需重新加载问题单元格以避免“闪烁”效果和失去控制焦点)?

我的第一个想法是将控制器实例设置为问题单元格,然后问题单元格可以将此实例传递给其答案子视图,然后答案视图可以在答案值更改时调用控制器上的方法。但我认为拥有一个包含控制器实例的视图是一种不好的模式,对吗?

第二个想法:在对象的所有属性上使用 KVO,当值发生变化时,使用修改后的值 keypath 检索关联的问题模型,这样我就可以从控制器应用验证规则,但是如何检索问题视图现在更改错误图标可见性的实例?

我没有第三个想法,这就是为什么我写了这么长的帖子:)

很少回忆涉及的类:问卷模型实例包含问题模型实例的子类,问卷视图控制器为每个“问题”模型实例显示“问题”单元格。“问题”单元格包含每个答案的视图。

PS:我故意使用 .xib 仅包含答案,而不是问题及其答案,因为我有其他限制,例如:

  • 有多个不基于答案类型的问题布局,我不想拥有(答案类型的数量 * 问题布局的数量).xib
  • 一个问题有多个答案。
4

1 回答 1

0

您的视图控制器(包含集合视图的控制器)应该包含在您的视图和数据之间进行调解的逻辑。视图应该只向视图控制器报告有哪些数据,并且视图控制器应该进行验证(基于它对数据的访问)。

答案视图当然可以有自己的视图控制器,它负责显示和布局 UI 元素的细节以及处理用户输入。这是有道理的,因为你有很多不同的场景。(如果没有,集合视图视图控制器可以处理它。)

通过您自己的委托协议通知视图控制器。在诸如此类的 UI 元素回调中textField:didEndEditing:,您可以随后调用委托以通知它有关用户输入的数据的更改。

于 2013-08-24T09:20:16.203 回答