我能想到几个办法
为您提到的所有问题创建单独的视图控制器,并将标签和文本字段明确放置在 Interface Builder 中。如果问题具有相似的潜在响应,这可能会引入大量重复。
-
创建一组表示所有可能布局的视图控制器,并根据内容(例如问题类型)动态选择您需要的视图控制器。例如,如果它是 4 选择或 3 选择多项选择题,或者带有文本字段或答案文本视图的开放式问题等。然后可以根据您的问题数据的定义方式重复使用这些问题。
创建一种动态指定所有布局变量的方法(可能是 JSON 文档),您可以在其中动态添加代码中的所有内容,包括控件定位。虽然约定可能比代码中的完全显式放置更容易实现。
如果是我,我可能会选择这两个中的第二个,并在 JSON 文档中开发元数据问题/答案描述。这样的事情可能会让你开始:
{
"questions" : [
{
"question" : "What was your favorite part of the course?",
"type" : "multi",
"options" : [
"Introduction",
"Content",
"Conclusion"
]
},
{
"question" : "How would you improve the course if you could?",
"type" : "open-ended",
"options" : []
},
{
"question" : "Did your lab partner provide adequate input?",
"type" : "bool",
"options" : [
"Yes",
"No"
]
}
]
}
您可以分析问题类型字段并从中确定要使用哪个视图控制器。例如,如果您有多项选择,您可以让它包含一个表格视图,该视图将加载所有选项,并允许用户点击包含选项的表格单元格并切换单元格附件中的复选框。
对于开放式问题,只需忽略“选项”数组。在该类型问题的视图控制器中,只需在标签中显示问题,然后在文本字段中显示答案。
或者对于 bool 类型的问题,您可以有默认选项是/否,但也允许选项为真/假之类的其他选项。您将在该视图控制器中使用的控件是 UISwitch。
无论如何,选项非常开放,因为您正在定义它,但我肯定会尝试在保持动态与您自己的元数据 DSL 之间找到一个很好的平衡,但不为自己做太多工作,这是不值得的.我之所以选择 JSON,是因为您可以将其捆绑在您的应用程序中并从磁盘加载,或者如果您希望它可以定期更新而无需重新构建,您也可以轻松地从端点下载它你的应用程序。