如何从 UICollectionViewController 验证 UICollectionViewCell 的值
Posted
技术标签:
【中文标题】如何从 UICollectionViewController 验证 UICollectionViewCell 的值【英文标题】:How to validate values of UICollectionViewCell from the UICollectionViewController 【发布时间】:2013-08-24 08:46:50 【问题描述】:我有以下设计问题,希望有人能帮我解决:)
我有一个视图控制器,它采用问卷模型实例并使用集合视图呈现此问卷。此问卷模型包含一系列问题模型(每个问题实例都是基本问题类的不同子类,具体取决于答案类型,例如:日期问题、布尔问题......)。
collectionview 中的每个单元格代表一个问题并包含从 .xib 加载的答案视图,具体取决于答案类型(1 xib = 1 种答案)。 答案视图可能包含 UISwitch、UITextField 或任何其他允许用户回答问题的控件。
目前,答案视图根据答案验证规则配置控件(例如,日期问题可能具有根据日期问题模型中的内容配置的 datepicker minimumDate/maximumDate 属性,或文本字段的正确键盘等...)。 答案视图也是控件的委托/观察者/目标,当其值发生变化时,视图会在目标对象中设置值(如果需要,使用格式化程序并取决于答案类型)。我认为我在这里已经遇到了问题,我有一个视图在模型中设置一个值而不使用控制器,而不是真正的 MVC 对吗?
现在我的主要问题是:视图控制器应该能够验证值,并根据验证结果在屏幕顶部显示错误标签,并取消隐藏错误图标。但是我怎样才能让我的视图控制器通知值更改?而且我还需要检索关联的答案视图实例以显示错误图标(无需重新加载问题单元格以避免“闪烁”效果和失去控制焦点)?
我的第一个想法是将控制器实例设置为问题单元格,然后问题单元格可以将此实例传递给其答案子视图,然后答案视图可以在答案值更改时调用控制器上的方法。但我认为拥有一个包含控制器实例的视图是一种不好的模式,对吧?
第二个想法:在对象的所有属性上使用 KVO,当值发生变化时,使用修改后的值 keypath 检索关联的问题模型,这样我就可以从控制器应用验证规则,但是我该如何检索现在要更改错误图标可见性的问题视图实例?
我没有第三个想法,这就是为什么我写了这么长的帖子:)
所涉及的类的小回忆:问卷模型实例包含问题模型实例的子类,问卷视图控制器为每个“问题”模型实例显示“问题”单元格。 “问题”单元格包含每个答案的视图。
PS:我故意使用 .xib 来只包含答案,而不是问题及其答案,因为我有其他限制,例如:
有多个不基于答案类型的问题布局,我不想拥有(答案类型数 * 问题布局数).xib 一个问题有多个答案。【问题讨论】:
【参考方案1】:您的视图控制器(包含集合视图的控制器)应该包含在您的视图和数据之间进行调解的逻辑。视图应该只向视图控制器报告有哪些数据,并且视图控制器应该进行验证(基于它对数据的访问)。
答案视图当然可以有自己的视图控制器,它负责显示细节、布局 UI 元素以及处理用户输入。这是有道理的,因为你有很多不同的场景。 (如果没有,集合视图视图控制器可以处理它。)
通过您自己的委托协议通知视图控制器。在 UI 元素回调中,例如textField:didEndEditing:
等,您可以随后调用委托来通知它有关用户输入的数据的更改。
【讨论】:
我不确定是否正确理解这句话“答案视图当然可以有自己的视图控制器,它负责显示和布局 UI 元素以及处理用户输入的细节” .你建议我为每个答案创建 1 个 VC 吗?如果我遵循这个想法,我将不得不在集合视图 VC 中使用视图控制器包含 API 对吗?以上是关于如何从 UICollectionViewController 验证 UICollectionViewCell 的值的主要内容,如果未能解决你的问题,请参考以下文章
如何从外部从 GitHub 加载 JavaScript 文件? [复制]