SwiftUI:在表中使用切换,无法将绑定传递给切换

mi7gmzs6  于 2022-12-03  发布在  Swift
关注(0)|答案(1)|浏览(134)

我尝试在SwiftUI中创建一个表。此表将包含三列:
| 已启用|名称名称名称|版本号|
| - -|- -|- -|
| 根据项目的 isEnabled bool值开启或关闭的切换|根据项目的 name 字符串的项目名称|根据项目的 version 字符串的项目版本|
我使用的数据模型如下所示:

let mods: [Mod] = [
    Mod(name: "Some cool mod", version: "1.2", isEnabled: true),
    Mod(name: "Another interesting item", version: "1.4", isEnabled: true),
    Mod(name: "Very Cool", version: "10.1.45", isEnabled: false)
]

我使用绑定将此数据传递给另一个视图(称为 InstanceSettingMods)。

@Binding var mods: [Mod]?

在父视图中,它是这样传入的:

InstanceSettingMods(mods: $mods)

我在使用 NameVersion 创建和填充表时没有遇到任何问题,但我不知道如何实现 Enabled 列。Toggle需要一个绑定,但我不知道如何将绑定传递给它。
该表的定义如下:

struct InstanceSettingMods: View {
    
    @Binding var mods: [Mod]?
    
    var body: some View {
        Table(mods!) {
            TableColumn("Enabled") { 
               TOGGLE GOES HERE
            }
            TableColumn("Name", value: \.name)
            TableColumn("Version", value: \.version)
        }
    }
}

我可以将 isEnabled 的值传递到Table中,如果我将它们转换为String,则显示它们,如下所示:

struct InstanceSettingMods: View {

    @Binding var mods: [Mod]?
    
    var body: some View {
        Table(mods!) {
            TableColumn("Enabled") { toggleValue in
                Text(toggleValue.isEnabled.description)
            }
            TableColumn("Name", value: \.name)
            TableColumn("Version", value: \.version)
        }
    }

}

Table with isEnabled values as Strings
由于Toggle需要一个绑定,如果我尝试以这种方式创建Toggle,我会收到错误***在范围内找不到'$toggleValue'***:

TableColumn("Enabled") { toggleValue in
    Toggle("", isOn: $toggleValue.isEnabled)
}

如果我从定义中删除**$**,则会得到以下错误:无法将型别'Bool'的值转换成预期的参数型别'Binding'
我想知道如何创建一个切换,让我启用/禁用表中的每个国防部。

ca1c2owp

ca1c2owp1#

解决方案是通过以下方式创建自定义绑定:

Toggle("", isOn: Binding<Bool>(
   get: {
      return mod.isEnabled
   },
   set: {
      if let index = mods.firstIndex(where: { $0.id == mod.id }) {
         mods[index].isEnabled = $0
      }
   }
))

相关问题