抱歉,我是 SwiftUI 新手 -
我有一个类(Meal),其中包含另一个类(Food)的对象数组。我在这里试图实现的是能够添加食物并在列表中进行更新,然后能够通过点击单个食物来编辑它。
我正在遍历食物列表并使用每种食物 (1) 创建 NavigationLink 和 (2) 简单地在列表中列出食物的名称。问题是,Initializer 'init(_:)' requires that 'Binding<String>' conform to 'StringProtocol'
当我尝试以“未绑定”的方式引用食物时,我得到了错误。具体来说,在下面的代码中,它位于行Text(food.name)
。
ForEach($meal.foods) { food in
NavigationLink(destination: FoodView(food: food)) {
Text(food.name)
}
}
我知道我可以改为遍历索引列表(我认为),但我认为这可能是一种不好的做法。我正在尝试找出这种情况下的最佳做法。提前致谢!
完整代码如下:
// MARK: Views
struct ContentView: View {
@State private var day = Day()
var body: some View {
MealView(meal: $day.meals.first!)
}
}
struct MealView: View {
@Binding var meal: Meal
var body: some View {
NavigationStack {
List {
ForEach($meal.foods) { food in
NavigationLink(destination: FoodView(food: food)) {
Text(food.name)
}
}
}
}
}
}
struct FoodView: View {
@Binding var food: Food
var body: some View {
VStack {
TextField("Food", text: $food.name)
}
}
}
// MARK: Data
class Day {
var meals: [Meal] = [Meal()]
}
@Observable
class Meal: Identifiable {
var id: UUID = UUID()
var foods: [Food] = [Food(name: "Pizza"), Food(name: "Pasta"), Food(name: "Steak")]
}
@Observable
class Food: Identifiable {
var id: UUID = UUID()
var name: String
init(name: String) {
self.name = name
}
}
错误说
这说明
Text
初始化器想要符合StringProtocol
但Binding<String>
不符合的东西;food
是Binding<String>
。您需要访问绑定的字符串,您可以使用绑定的wrappedValue
属性来执行此操作 -@Binding
仅适用于值或结构,不适用于类@Observable
。将其更改为let
只读,@Bindable
如果您想从类属性获取绑定,例如注意,视图通常不以模型类型命名。