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

已解决:如何重置ObservableObject状态且不引发异常?

SwiftUI ObservableObject重置失效问题解决

已成功解决问题,原因是依赖.onAppear设置ObservableObject属性,而非使用按钮这类明确的前置用户操作触发重置。

问题详情

  • 在App文件中创建了GolfController类的StateObject实例,该类包含多视图共享的结构体与函数
  • 所有视图通过EnvironmentObject获取该实例,使用NavigationView和NavigationLink进行顺序导航
  • 视图仅调用Controller的函数并读取其值,所有值修改逻辑都在Controller内部实现
  • 需求:完成视图流程后重置Controller状态,支持用户重复流程;但通过ContentView的.onAppear调用重置函数时,应用直接跳转到View2,重置操作被忽略,Controller值短暂重置后又恢复旧值

相关代码

视图代码

import SwiftUI

struct InPlay: View {
    var myCourseId:Int = -1
    @EnvironmentObject var golfController: GolfController
 
    var body: some View {
        VStack (spacing: 5){
            VStack{
                Text("\(golfController.golfData.course[golfController.courseIndex].name)")
                    .font(.system(size: 20))
                    .foregroundColor(golfController.roundFinished ? .gray : GolfColor.golfBlue)
                    .frame(maxWidth: .infinity, alignment: .leading)
                    .offset(x:12, y:-5)
            }
            
            HStack(spacing:35){
                HStack(spacing: 0){
                    Text("\(golfController.thisRound.holes[golfController.holeIndex].holeStrokes)")
                        .gesture(tapGesture)
                        .font(.system(size: 65))
                        .fontWeight(.thin)
                        .frame(width: 200, height: 100)
                        .frame(maxWidth: .infinity, alignment: .center)
                        .foregroundColor(golfController.roundFinished ? .gray : golfController.editMode ? GolfColor.golfGreen : GolfColor.golfBlue)
                        .position(x: 35, y: 0)
                        .disabled(golfController.roundFinished)
                }
            }
        }
        .environmentObject(golfController)
        .onAppear{
            golfController.resetGolfController()
        }
        .navigationBarTitle("")
        .navigationBarBackButtonHidden(true)
        .navigationBarHidden(true)                    
    }
    
    struct InPlay_Previews: PreviewProvider {
        static var previews: some View {
            InPlay(myCourseId: 0)
        }
    }
}

Controller重置函数

func resetGolfController() {
    calculatedPar = ""
    parColor = Color.black
    selectedCoursename = ""
    courseId = 0
    courseIndex = 0
    holeIndex = 0
    showingPinConfirmation = false
    showingDropConfirmation = false
    showingQuitConfirmation = false
    currentHole = 0
    editMode = false
    scorecardScore = 0
    roundFinished = false
    storePin = false
    holeParPrefix = ""
    thisRound = Round(startTimestamp: "", endTimestamp: "", roundScore: 0, roundPar: "0", holes: [RoundHole(holeNum: 1, holeStrokes: 0, holePar: "-", strokes: [])])
    golfData.readFromFile()
}

内容的提问来源于stack exchange,提问作者Paul Brankin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:09:18