SwiftUI调用ModificaStagione视图时Stagione类型转换错误求助
问题解决:SwiftUI中Sheet传递Stagione实例错误
错误原因
你收到的Cannot convert value of type 'Stagione.Type' to expected argument type 'Stagione'错误,是因为在SettingsView的sheet代码里,你传递的是Stagione这个类型本身,而不是用户选中的具体Stagione实例。
具体修改步骤
1. 在SettingsView中添加选中实例的存储变量
替换原来的@State private var modificaStagione = false,新增一个用于存储待编辑实例的变量:
@State private var stagionDaModificare: Stagione?
2. 修改ContextMenu中的"Modifica"按钮逻辑
点击按钮时,从选中集合中取第一个实例(适配单选场景),赋值给上面的变量:
Button(action: { stagionDaModificare = selStagione.first }) { Text("Modifica") }
3. 替换Sheet的触发方式
把原来基于isPresented的sheet改成基于item的版本,这样可以直接传递选中的实例,同时确保只有选中实例时才弹出Sheet:
.sheet(item: $stagionDaModificare) { stag in ModificaStagione(stagione: stag) }
注意:需要让你的
Stagione模型遵循Identifiable协议(SwiftData模型添加该协议不影响存储):
@Model class Stagione: Identifiable { var idStagione: String var categoriaStagione: String var miaSquadra: String init(idStagione: String, categoriaStagione: String, miaSquadra: String) { self.idStagione = idStagione self.categoriaStagione = categoriaStagione self.miaSquadra = miaSquadra } }
4. 修复ModificaStagione的可编辑问题
因为SwiftData模型实例默认不可变,需要用@Bindable包装才能修改属性,同时补充导航容器让标题正常显示:
import SwiftUI import SwiftData struct ModificaStagione: View { @Environment(\.dismiss) private var dismiss @Bindable var stagione: Stagione // 替换let为@Bindable @State private var idStagione = "" @State private var categoria = "" @State private var miaSquadra = "" var body: some View { NavigationStack { VStack (alignment: .leading) { GroupBox { LabeledContent { TextField("", text: $idStagione) .frame(width: 150) } label: { Text("Stagione:") } LabeledContent { TextField("", text: $categoria) .frame(width: 400) } label: { Text("Categoria:") } LabeledContent { TextField("", text: $miaSquadra) .frame(width: 400) } label: { Text("Mia squadra:") } if modifica { Button("Aggiorna dati") { stagione.idStagione = idStagione stagione.categoriaStagione = categoria stagione.miaSquadra = miaSquadra dismiss() } .buttonStyle(.borderedProminent) } } .padding() .textFieldStyle(.roundedBorder) } .navigationTitle("Modifica dati stagione") .navigationBarTitleDisplayMode(.inline) } .onAppear { idStagione = stagione.idStagione categoria = stagione.categoriaStagione miaSquadra = stagione.miaSquadra } } var modifica: Bool { categoria != stagione.categoriaStagione || miaSquadra != stagione.miaSquadra || idStagione != stagione.idStagione } }
内容的提问来源于stack exchange,提问作者AndreB82
相关产品推荐
相关产品推荐

