PresentationMode 触发“变量 X 在初始化之前使用”

tey*_*non 6 swiftui

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

@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
}
Run Code Online (Sandbox Code Playgroud)

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

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 ])
    }
}
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 9

这是代码的固定部分:

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
    }

// ...
Run Code Online (Sandbox Code Playgroud)

使用 Xcode 13 / iOS 15 进行测试

  • @swiftPunk 这很奇怪,因为副作用和错误消息与实际问题无关。如果删除完全不相关的“@Environment(\.presentationMode) varpresentationMode: Binding&lt;PresentationMode&gt;”,则根本不会发生该错误。错误消息抱怨与图片中突出显示的文本不同的变量。这个错误消息或解决它的方法没有什么直观的。我认为这使得事情变得很奇怪。对我来说似乎是 XCode 中的一个错误。 (5认同)
  • 这是一个非常奇怪的问题,有一个奇怪的错误消息,还有一个奇怪的修复。虽然有效... (4认同)
  • @swiftPunk如果不奇怪的话,你能解释一下为什么如果我删除`@Environment(\.presentationMode) varpresentationMode: Binding&lt;PresentationMode&gt;`上面的代码会起作用吗? (2认同)