首页 > 解决方案 > 导致导航链接初始化丢失的状态变量

问题描述

我在 aboutView(ContentView 的底部)的导航链接中遇到了一些奇怪的错误:

  1. 由于“私人”保护级别,aboutView 初始化程序不可访问
  2. 调用中缺少参数“useHomeCur”的参数
  3. 预期的表达式 Xcode 还建议我在 ContentView 中插入 ', useHomeCur: <#Bool#>'

我不会在任何其他视图中遇到这些错误。aboutView.swift 中没有发生错误。就好像 aboutView 是 ContentView 的子视图一样。它希望我在 ContentView 中定义一个 aboutView 状态参数。为什么?如果我在 aboutView 中输出状态参数和选项,效果会很好。

我也尝试过: .navigationBarItems(trailing: NavigationLink(destination: aboutView()) { Text("About"). 此编码消除了预期的表达式错误

iOS 14.0 Xcode 12.0.1 盖伦

struct ContentView: View {

    @State private var activateAbout = false
    
    var body: some View {
        
        NavigationView {
            VStack {
                
                   ... menu navigation links
            }
            .font(.title)
            .navigationBarTitle("blah blah blah", displayMode: .inline)
            .background(
                // hide programmatically activated link here !!
                NavigationLink(destination: aboutView(), isActive: $activateAbout) { EmptyView()
            )
                    .navigationBarItems(trailing: Button( action: {
                    // not add - only activate it here, otherwise it will not work
                        self.activateAbout = true
                    }) {
                        Text("About")
                    }
                }           
            }
            
            .onAppear(perform: loadCurrencies)
        }
    }
}

这里是关于查看>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

struct aboutView: View {
    
    @EnvironmentObject var userData: UserData
    @State private var useHomeCur: Bool
    
    var body: some View {

        NavigationView {
        Form {
                VStack (alignment: .center) {
                    Text("blah blah blah")
                    Text("blah blah blah")
                }.font(.body)
            
                Toggle(isOn: $useHomeCur) {
                    Text("Use this fancy feature")
               }.padding()

           NavigationLink(destination: docView()) {
                Text("Documentation")
            }
        }.navigationBarTitle("About", displayMode: .inline)
  
        }
    }
}

标签: swiftui

解决方案


状态变量用于内部视图使用,因此应在内部初始化(并且将其设为私有是一种很好的做法)。如果您需要状态具有来自超大的初始值,那么在 init 中显式执行,例如

  1. 内部初始化的变体
struct aboutView: View {
    
    @EnvironmentObject var userData: UserData
    @State private var useHomeCur: Bool = false    // << here !!
  1. 外部初始化的变体
struct aboutView: View {
    
    @EnvironmentObject var userData: UserData
    @State private var useHomeCur: Bool

    init(useHomeCur: Bool = false) {
       _useHomeCur = State(initialValue: useHomeCur)    // << here !!
    }
    ...

推荐阅读