You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:53:19