我有以下设计问题,我希望有人能帮我解决它:)
我有一个视图控制器,它采用问卷模型实例并使用集合视图呈现此调查问卷。该问卷模型包含一系列问题模型(每个问题实例根据答案类型是基本问题类的不同子类,例如:日期问题,布尔问题......)。
集合视图中的每个单元格代表一个问题,并包含根据答案类型从.xib加载的答案视图(1 xib = 1种答案)。 答案视图可能包含UISwitch,UITextField或允许用户回答问题的任何其他控件。
目前,答案视图根据答案验证规则配置控件(例如,日期问题可能根据日期问题模型中的内容配置datepicker minimumDate / maximumDate属性,或者为文本字段等配置正确的键盘...)。 答案视图也是控件的委托/观察者/目标,当其值发生变化时,视图会在目标对象中设置值(如果需要,使用格式化程序,具体取决于答案类型)。我认为我已经有问题,我有一个View在模型中设置一个值而不使用Controller,不是真的MVC对吗?
现在我的主要问题是:View Controller应该能够验证这些值,并根据验证结果在屏幕顶部显示错误标签,并取消隐藏错误图标。但是,如何让我的viewcontroller通知值变化?我还需要检索相关的答案视图实例以显示错误图标(不重新加载问题单元格以避免“闪烁”效果和失去控制焦点)?
我的第一个想法是将控制器实例设置为问题单元格,然后问题单元格可以将此实例传递给其答案子视图,然后当答案值更改时,答案视图可以调用控制器上的方法。但我想拥有一个包含控制器实例的视图是一个糟糕的模式吧?
第二个想法:在对象的所有属性上使用KVO,当值发生变化时,使用修改后的值keypath检索关联的问题模型,这样我就可以从控制器应用验证规则,但是如何检索现在更改错误图标可见性的问题视图实例?
我没有第三个想法,这就是为什么我写了这么长的帖子:)
很少回忆所涉及的类:问卷调查模型实例包含问题模型实例的子类,问卷调查视图控制器显示每个“问题”模型实例的“问题”单元格。 “问题”单元格包含每个答案的视图。
PS:我故意使用.xib只包含答案,而不是问题和答案,因为我有其他限制,例如:
答案 0 :(得分:0)
您的视图控制器(包含集合视图的视图控制器)应包含介于视图和数据之间的逻辑。视图应该只向视图控制器报告有哪些数据,视图控制器应该进行验证(基于其对数据的访问)。
答案视图当然可以有自己的视图控制器,它负责显示和布置UI元素以及处理用户输入的细节。这是有道理的,因为你有很多不同的场景。 (如果没有,集合视图视图控制器可以处理它。)
通过您自己的委托协议通知视图控制器。在UI元素回调中,例如textField:didEndEditing:
等,您可以调用委托来通知它有关用户输入的数据的更改。