已解决:如何重置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
相关产品推荐
相关产品推荐

