首页 > 解决方案 > PresentationMode 触发“在初始化之前使用的变量 X”

问题描述

错误信息 我正在尝试为 SwiftUI 应用程序编写一个可重用的快速选择字段编辑器。下面的代码仅在存在 时显示Variable 'self.fieldValue' used before initialized错误@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>。如果我删除它,视图编译得很好。任何人都知道为什么presentationmode环境变量会导致这个以及如何解决它?我需要presentationmode env var,因此一旦用户单击按钮,我就可以快速弹出视图。

@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

@State var viewName = "Edit Field"
@Binding var fieldValue: Int
@State var fieldName: String = ""
var options: [Int]

init(title: String, field: String, value: Binding<Int>, list: [Int]) {
    viewName = title
    fieldName = field
    _fieldValue = value
    options = list
}

有关完整视图代码,请参见下文。

import SwiftUI

struct CommonNumberEditView: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    
    @State var viewName = "Edit Field"
    @Binding var fieldValue: Int
    @State var fieldName: String = ""
    var options: [Int]
    
    init(title: String, field: String, value: Binding<Int>, list: [Int]) {
        viewName = title
        fieldName = field
        _fieldValue = value
        options = list
    }
    
    var body: some View {
        ZStack {
            Image("sky")
                .resizable()
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
                .edgesIgnoringSafeArea(.all)
                .opacity(0.5)
            
            VStack(alignment: .center, spacing: 5)
            {
                JumpLogNumberField(label: self.fieldName, val: self.$fieldValue)
                
                ScrollView {
                    
                    VStack(alignment: .center, spacing: 5) {
                        ForEach(options, id: \.self) { item in
                            Group {
                                Button(action: {
                                    self.presentationMode.wrappedValue.dismiss()
                                }) {
                                    Text(String(item))
                                        .foregroundColor(.black)
                                        .padding(20)
                                }
                                .frame(minWidth:0, maxWidth: .infinity)
                                .background(Color.white.opacity(0.6))
                            }
                        }
                    }
                }
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .top)
            }
            .padding(.top, 40)
            .padding(.leading, 40)
            .padding(.trailing, 40)
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
            
        }.navigationBarTitle(viewName, displayMode: .inline)
    }
}

struct CommonFieldEditView_Previews: PreviewProvider {
    
    static var previews: some View {
        CommonNumberEditView(title: "Edit Field", field: "Altitude", value: .constant(5000), list: [ 13500, 10000, 5500, 3500 ])
    }
}

标签: swiftui

解决方案


这是代码的固定部分:

struct CommonNumberEditView: View {
    @Environment(\.presentationMode) var presentationMode

    @State private var viewName: String
    @Binding var fieldValue: Int
    @State private var fieldName: String
    var options: [Int]

    init(title: String, field: String, value: Binding<Int>, list: [Int]) {
        _viewName = State(initialValue: title)
        _fieldName = State(initialValue: field)
        _fieldValue = value
        options = list
    }

// ...

使用 Xcode 13 / iOS 15 测试


推荐阅读