【问题标题】:Connecting UIViews to json response and vice versa将 UIViews 连接到 json 响应,反之亦然
【发布时间】:2021-05-12 01:53:39
【问题描述】:

我目前正在制作一个应用程序,该应用程序基本上将包含一个主 UIView 和动态堆栈视图,该堆栈视图从 JSON 接收数据,当用户编辑该视图上的文本字段时,我希望相应地编辑接收到的 json,然后提交到服务器。该视图类似于以下屏幕截图:

第一个和第二个选项卡是可以关闭和打开的自定义堆栈视图。最初,每个 stackview 都包含一个将自定义视图附加到当前选项卡的内部 stackview 的按钮。用户可以单击每个自定义内部视图上的编辑,这会在其下打开一个隐藏视图,其中包括他可以填充的文本字段,或者完全删除子视图。

我希望在应用程序和服务器之间交易的 json 看起来像这样:

{
    "firstTab": [
        {
            "itemA": false,
            "itemB": 2,
            "itemC": "type",
            "itemD": "tt"
        },
        {
            "itemA": false,
            "itemB": 2,
            "itemC": "type",
            "itemD": "dd"
        }
    ],
    "secondTab": [
        {
            "itemA": "test",
            "itemB": 2,
            "itemC": "a"
        },
        {
            "itemA": "test",
            "itemB": 2,
            "itemC": "type"
        },
        {
            "itemA": "test",
            "itemB": 2,
            "itemC": "type"
        }
    ]
}

其中每个项目都是相应堆栈视图中的文本字段。

应用程序第一次打开时,应用程序必须像上面一样从服务器接收一个草稿 json,并在 stackviews 中制作适当的元素。我已将 json 映射到可编码,但如果不求助于自定义解决方案,我似乎无法有效地呈现 UI。在 Swift 中有没有一种有效的方法来做到这一点?

本质上,我想将动态字段映射到 json 值并能够编辑这些值。 UI 和本地 json 文件之间的双向连接。有没有一种本地方法可以快速做到这一点?还是推荐的图书馆?

【问题讨论】:

    标签: ios json swift uikit


    【解决方案1】:

    您可以通过使用符合Codable / Encodable 的结构来解决这个问题。这可能是最干净的方式。

    这些协议用作(或可以用作)JSON 包装器,用于编码和解码。

    所以你会有一个这样的结构:

    struct FirstTab: Encodable {
        let itemA: Bool
        let itemB: Int
        let itemC: String
        let itemD: String
    }
    

    您将使用用户交互提供的信息更改结构,即:UITextField

    这个结构现在可以通过JSONEncoder进行编码/解码

    请看:

    JSONEncoder 文档: https://developer.apple.com/documentation/foundation/jsonencoder

    Codable 协议: https://developer.apple.com/documentation/swift/codable

    Decodable 协议: https://developer.apple.com/documentation/swift/decodable

    Encodable 协议: https://developer.apple.com/documentation/swift/encodable

    重要的是,Encoding and Decoding Custom Types 文档: https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types

    【讨论】:

    • 感谢您的回复,我现在看得更清楚了。我唯一的问题是,将文本字段分配给结构中某个字段的干净方法是什么?由于两个选项卡都可以有很多组项目,因此我想将 firstTab 数组中第 10 个元素的值 itemC 设置为“test1”。我将如何实现这一目标?您如何设置每个动态 uitextfield 以了解要更新的值。
    • 我不确定我是否理解你的问题,但你会使用类似:let variable: String? = myTextfield.text
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2012-06-14
    • 2017-11-17
    • 1970-01-01
    • 2016-01-15
    相关资源
    最近更新 更多