【问题标题】:Binding in SwiftUI ForEach from Parent to Child在 SwiftUI ForEach 中从父级绑定到子级
【发布时间】:2021-11-26 05:18:00
【问题描述】:

我有一个这样定义的Subtask

struct Subtask: Identifiable{
  var id = UUID().uuidString
  var text = ""
}

我在ObservableObject 中填充它们的数组,如下所示:

//View Model
class SubtaskModel: ObservableObject {
  static let shared = SubtaskModel()

  @Published var subtasks = [Subtask]()
  
  init(){
    //Code that creates the subtasks array
  }
}

然后我像这样在我的父视图中开始渲染它们:

//Parent View
struct ParentView: View {
  @StateObject var model = SubtaskModel.shared
  ...
  
  ForEach($model.subtasks) { subtask in
    ChildView(subtask: $subtask)
  }
}

为了能够在子视图中修改每个 Subtask

//Child View
struct ChildView: View{
  @Binding var subtask: Subtask
  
  ...
  TextField("Text...", text: $subtask.text, onCommit:{
    print("Save subtask!")
  })
}

我在此行的ParentView 中遇到错误:

ChildView(subtask: $subtask)

...上面写着:

在范围内找不到“$subtask”

所以看来ForEach 没有为我的视图模型返回的每个subtasks 返回一个绑定。我尝试了ForEach 的其他变体,但仍然收到错误:

ForEach(model.subtasks) { subtask in
ForEach($model.subtasks, id: \.self) { subtask in
ForEach($model.subtasks, id: \.id) { subtask in

如何将子 Subtask 从父视图绑定到子视图?

【问题讨论】:

    标签: swift swiftui observableobject swiftui-foreach


    【解决方案1】:

    您在subtask 之前错过了$

    如果你不写$subtask,那么subtask 现在是Binding<Subtask>。这意味着您仍然可以使用subtask.wrappedValue 来正常使用subtask 并使用subtask 来使用绑定,但这并不那么整洁。对于$$subtaskBinding<Subtask>subtaskSubtask

    变化:

    ForEach($model.subtasks) { subtask in
        ChildView(subtask: $subtask)
    }
    

    收件人:

    ForEach($model.subtasks) { $subtask in
        ChildView(subtask: $subtask)
    }
    

    或者(更令人困惑的是,我推荐):

    ForEach($model.subtasks) { subtask in
        ChildView(subtask: subtask)
    }
    

    【讨论】:

    • 嗯...将其更改为 $subtask 会导致两个新错误:Generic struct 'ForEach' requires that 'Binding<[Subtask]>' conform to 'RandomAccessCollection',然后是 Unable to infer type of a closure parameter '$subtask' in the current context。我从未在ForEach 的迭代值上看到$。 ?
    • @CliftonLabrum 它在 Xcode 13 中工作。它被称为 element binding syntax,它需要 Xcode 13。可以反向部署到任何以前的 iOS 版本。
    • 哦,有趣。我正在使用 Xcode 13。我是否必须以某种方式启用这样的前瞻性功能?我的应用目标是 iOS 14 和 macOS 11。
    • @CliftonLabrum 也许编译器给你带来了麻烦,用{ ($subtask: Binding<Subtask>) in明确指定类型有效吗?
    • 当我为 iOS 15 构建它时它正在工作(没有指定的类型)。它只是不适用于我的应用程序的 Mac 版本,所以我必须有一个单独的问题。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多