【问题标题】:How to add a boolean variable for each item in a list SwiftUI如何为列表SwiftUI中的每个项目添加一个布尔变量
【发布时间】:2021-05-19 11:58:19
【问题描述】:

我有一个包含项目列表的菜单列表。我在每个项目上都附加了一个“订购此”按钮。为了防止用户多次订购同一个菜单(是的,他们不应该订购多个......)我想为每个项目设置一个布尔变量。当他们点击“Order this”时,布尔值变为 true,按钮变为文本“menuordered”。

我最初的尝试是使用 EnvironmentObject var:

class MenuState: ObservableObject {
@Published var items = [MenuItem]()
var mstate: Bool = false }

但是,当我这样做时,布尔值不会分配给列表中的每个项目。因此,单击时列表中的所有项目都会发生变化。

在菜单结构中分配变量似乎是解决方案,但我使用 json 制作了项目,这是不可变的。

那么,当使用 json 创建项目时,如何为每个项目附加布尔变量?

struct MenuItem: Codable, Equatable, Identifiable {
var id: UUID
var name: String}

[
{
    "id": "EF1CC5BB-4785-4D8E-AB98-5FA4E00B6A66",
    "name": "Dish",
    "items": [
        {
            "id": "36A7CC40-18C1-48E5-BCD8-3B42D43BEAEE",
            "name": "Stack-o-Pancakes",
        }]

【问题讨论】:

    标签: json swiftui swiftui-list


    【解决方案1】:

    您可能应该将布尔值添加为每个 MenuItem 的瞬态属性 - 按照您的方式,mstate 指的是整个菜单:

    struct MenuItem: Codable, Equatable, Identifiable {
    var id: UUID
    var name: String
    var isOrdered: Bool?
    }
    

    有几种方法可以将属性添加到MenuItem 并防止其被解码:我在此处的代码中将isOrdered 设为可选,但更好的解决方案是手动解码MenuItem 对象,例如在this answer

    另一种选择是在您的MenuState 上拥有一个包含Bool 值的数组或字典,以将Bool 值与特定的MenuItem 相关联。

    【讨论】:

      猜你喜欢
      • 2021-08-10
      • 2021-12-24
      • 2021-12-22
      • 2014-05-02
      • 1970-01-01
      • 2020-05-22
      • 2014-12-13
      • 2010-10-08
      • 2022-11-07
      相关资源
      最近更新 更多