iOS - 将 JSON 转换为模型,并根据模型类型,显示 tableviewCell / Reusable UIView 组件并从其子视图中读取值

iOS - Convert JSON to model and based on the model type, display tableviewCell / Reusable UIView component and read the values from their subviews

提问人:iLoveIOS 提问时间:9/2/2021 最后编辑:iLoveIOS 更新时间:9/2/2021 访问量:66

问:

我有一个要求,服务器将向我们提供屏幕列表,每个屏幕都会有一组特定的问题。

这些问题的问题类型可能有所不同。即

  • 有些人可能需要 TextField 来提交答案(对输入进行验证),
  • 有些可能有单选按钮(有 YES 和 NO)
  • 有些会有复选框
  • 有些具有带有动态值的下拉列表

在移动端 (iOS) 中,我们需要从 Server 获取这些问题,将其转储到本地数据库中,然后根据 Screen 和 questionType 显示列表问题(在 Form 中)。

请提出一个好的方法!

我想到的一种方法是为每种问题类型创建自定义视图,即 radioButton 的可重用视图、TextInput 的可重用视图等。

并将所有这些视图添加到堆栈视图中并显示它。

但是,问题是如何保持所有这些添加视图的引用? 我的意思是,如果有 3 个类型为“inputTextfield”的问题,我们可以呈现一个可重用的视图,其中包含问题标签和 UITextfield(提交答案)。但是如何从每个组件中获取值(答案)并以表单形式提交所有问题及其答案?

iOS JSON Swift Dynamic-UI

评论

0赞 king wang 9/2/2021
首先保持简单!如果问题数量很大,请在 UITableView 中使用不同的单元格,否则在 UIStackView 中使用自定义视图。
0赞 iLoveIOS 9/2/2021
@kunwang QuestionCount 在每个屏幕上将有 5 到 10 个。但我的问题是,我怎样才能得到用户添加的答案?如果有儿童问题,我需要如何处理?子问题意味着>如果父问题的类型是单选按钮(是/否),并且用户选择“是”,则应该会出现一个子问题,该子问题也可以是不同的类型(即 InputField、Date、Dropdown 等)
0赞 Abdul Hoque Nuri 9/2/2021
每个问题和答案都需要唯一的 ID。以及子 UI 的其他详细信息设置(Button、TextFIeld 等)。希望您从服务器获得所有这些详细信息。
0赞 iLoveIOS 9/2/2021
@AbdulHoqueNuri 是的,这将从服务器接收。我唯一没有得到的是,如何获取(读取)用户对每个问题的输入。我的意思是,如果我的问题类型是带有 YES 和 NO 选项的 RadioButton,如果用户选择 YES,那么我需要显示一个新问题(假设它的问题类型是 InputText),并且需要阅读用户提供的该子问题的答案
0赞 Abdul Hoque Nuri 9/2/2021
是的,您需要设计这些 UI 格式。我的意思是为您的问题预定义 UI。您可以根据用户选择将这些 UI 称为布局并调用/重新加载。

答:

2赞 schmidt9 9/2/2021 #1

下面是一个简化的起始解决方案,如何将问题绑定到视图并获取视图值。首先,将数据映射到模型,然后应实现如何更新条目内答案的机制(例如,基于控制状态更改)。

import UIKit

struct Question {
    var text: String
    var type: EntryType
    /// use this array to output conditional nested questions
    var subquestions: [Question]
}

struct Answer {
    var text: String
}

enum EntryType {
    case text
    case radio
    case checkbox
    case dropdown
}

class Entry {
    var question: Question
    /// Set this field on text / state change of control
    var answer: Answer?
    var type: EntryType
    
    init(question: Question, type: EntryType) {
        self.question = question
        self.type = type
    }
}

struct CustomView {
    /// Assign this while views creation / output to bind entry and view and to update entry
    var entry: Entry
}

var entries = [Entry]() // TODO: populate array

// ... populate entries using answers and create views based on type