如何从对象数组创建切换绑定? [英] How to create Toggle binding from array of objects?

查看:26
本文介绍了如何从对象数组创建切换绑定?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

关于这个主题有几个有用的问题,但我发现的所有问题要么使用早期测试版中已弃用的语法(例如 BindableObject),要么不需要传递绑定(例如,到 Toggle).

There are several useful questions on this topic, but all I've found either use deprecated syntax from earlier betas (e.g., BindableObject) or do not require a binding be passed (e.g., to a Toggle).

我想创建一个绑定到数组元素的切换列表.我尝试了很多方法,但语法永远不正确.下面的版本最匹配 an现有问题.

I want to create a list of Toggles that are bound to elements in an array. I've tried many methods, but the syntax is never corrrect. The version below most closely matches the answers to an existing question.

struct Item: Identifiable {
    var id: String { self.name }
    var name: String
    var enabled: Bool
}

final class ItemSet: ObservableObject {
    @Published var items: [Item]

    init() {
        items = [
            Item(name: "aaa", enabled: true),
            Item(name: "bbb", enabled: false),
            Item(name: "ccc", enabled: true)
        ]
    }
}

var myItems = ItemSet()

struct ContentView: View {
    @ObservedObject var items: ItemSet

    var body: some View {
        List {
            ForEach(items.items) { item in
                Toggle(item.name, isOn: $item.enabled)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(items: myItems)
    }
}

我在 Xcode 11.1 中得到的编译器错误是:

The compiler error I get in Xcode 11.1 is:

使用未解析的标识符$item"

Use of unresolved identifier '$item'

在定义 Toggle 的行上.

on the line where Toggle is defined.

我的印象是每个 Item 本身都需要是一个 ObservableObject 并启用 @Published var: Bool 参数,但是我也无法使其正常工作,并且所有 stackoverflow 答案似乎都在说避免使 Item 本身成为 ObservableObject.

I was under the impression that each Item would itself need to be an ObservableObject with a @Published var enabled: Bool parameter, but I have not been able to get that working either, and all stackoverflow answers seems to say avoid making Item itself ObservableObject.

任何帮助将不胜感激.

推荐答案

您将 items(它是当前值主题)的属性包装器与 Toggle 的绑定参数混淆了 期待.请参阅以下绑定的更正实施:

You are confusing the property wrapper for items (which is a current value subject) with the binding parameter that a Toggle expects. See corrected implementation with binding below:

import SwiftUI
import Combine

struct Item: Identifiable {
  var isEnabled: Binding<Bool>
  var id: String { self.name }
  var name: String
  init(name: String, enabled enabledValue: Bool) {
    self.name = name
    let enabled = CurrentValueSubject<Bool, Never>(enabledValue)
    isEnabled = Binding<Bool>(
      get: { enabled.value },
      set: { enabled.value = $0}
    )
  }
}

final class ItemSet: ObservableObject {
  @Published var items: [Item]

  init() {
    items = [
      Item(name: "aaa", enabled: true),
      Item(name: "bbb", enabled: false),
      Item(name: "ccc", enabled: true)
    ]
  }
}

var myItems = ItemSet()

struct ContentView: View {
  @ObservedObject var items: ItemSet

  var body: some View {
    List {
      ForEach(items.items) { item in
        Toggle(isOn: item.isEnabled, label: { Text (item.name) })
      }
    }
  }
}

struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    ContentView(items: myItems)
  }
}

这篇关于如何从对象数组创建切换绑定?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆