首页 > 解决方案 > 如何在 SwiftUI 中将变量从“更高视图”转换为“下视图”?

问题描述

我是 SwiftUI 的新手,我知道如何在我的“特殊”情况下使用UserDefaults.standard.integer将变量“Selection”从 ContentView 获取到 SettingView 中。我认为使用@Binding 是不可能的,对吧?

import SwiftUI
import Combine

struct ContentView: View {
    
    @State var Selection = UserDefaults.standard.integer(forKey: "Picker")
    @State var Detail = false
    
    var body: some View {
        VStack {
        Button(action: {
            self.Detail.toggle()
        }) {
            Text("click")
        }.sheet(isPresented: $Detail) {
            SettingView(showSheetView: self.$Detail)
        }
        
        Picker("", selection: $Selection) {
            Text("Selection1").tag(0)
            Text("Selection2").tag(1)
            } .pickerStyle(SegmentedPickerStyle()).padding(.horizontal, 89)
            .onReceive(Just(Selection)) {
                UserDefaults.standard.set($0, forKey: "Picker")
            }
        }
    }
}

struct SettingView: View {
   
    @Binding var showSheetView: Bool
    
    var body: some View {
        NavigationView {
                Text("Test")
                .navigationBarTitle(Text("Select something"))
                .navigationBarItems(trailing: Button(action: {
                    self.showSheetView = false
                }) {
                    Text("Ok")
                        .bold()
                        
            })
        }
    }
}

标签: swiftswiftui

解决方案


您可以使用@Binding

.sheet(isPresented: $Detail) {
    // pass the `Selection` as a Binding
    SettingView(showSheetView: self.$Detail, selection: $Selection)
}
struct SettingView: View {
    @Binding var showSheetView: Bool
    @Binding var selection: Int // access as a Binding

    var body: some View {
        NavigationView {
            Text("Test \(selection)") // use as any other variable
            ...
        }
    }
}

注意:在命名 Swift 变量时,通常最好使用小写,即。selection而不是Selection


推荐阅读