我有以下设计问题,我希望有人能帮助我解决它:)
我有一个视图控制器,它采用问卷模型实例并使用集合视图呈现此问卷。此问卷模型包含一系列问题模型(每个问题实例是基本问题类的不同子类,具体取决于答案类型,例如:日期问题、布尔问题......)。
集合视图中的每个单元格代表一个问题并包含从 .xib 加载的答案视图,具体取决于答案类型(1 xib = 1 种答案)。答案视图可能包含 UISwitch、UITextField 或任何其他允许用户回答问题的控件。
目前,答案视图根据答案验证规则配置控件(例如,日期问题可能具有根据日期问题模型中的内容配置的 datepicker minimumDate/maximumDate 属性,或文本字段的正确键盘等... )。答案视图也是控件的委托/观察者/目标,当其值发生变化时,视图会在目标对象中设置值(如果需要,使用格式化程序并取决于答案类型)。我认为我在这里已经遇到了问题,我有一个视图在模型中设置一个值而不使用控制器,而不是真正的 MVC 对吗?
现在我的主要问题是:视图控制器应该能够验证值,并根据验证结果在屏幕顶部显示错误标签,并取消隐藏错误图标。但是我怎样才能让我的视图控制器通知值更改?而且我还需要检索关联的答案视图实例以显示错误图标(无需重新加载问题单元格以避免“闪烁”效果和失去控制焦点)?
我的第一个想法是将控制器实例设置为问题单元格,然后问题单元格可以将此实例传递给其答案子视图,然后答案视图可以在答案值更改时调用控制器上的方法。但我认为拥有一个包含控制器实例的视图是一种不好的模式,对吗?
第二个想法:在对象的所有属性上使用 KVO,当值发生变化时,使用修改后的值 keypath 检索关联的问题模型,这样我就可以从控制器应用验证规则,但是如何检索问题视图现在更改错误图标可见性的实例?
我没有第三个想法,这就是为什么我写了这么长的帖子:)
很少回忆涉及的类:问卷模型实例包含问题模型实例的子类,问卷视图控制器为每个“问题”模型实例显示“问题”单元格。“问题”单元格包含每个答案的视图。
PS:我故意使用 .xib 仅包含答案,而不是问题及其答案,因为我有其他限制,例如:
- 有多个不基于答案类型的问题布局,我不想拥有(答案类型的数量 * 问题布局的数量).xib
- 一个问题有多个答案。