SwiftUI中的Swift @propertyWrapper

时间:2019-12-12 05:27:56

标签: swiftui


我正在使用SwiftUI为macOS创建TabView。
希望
1)用户单击tabItem时,会将选定的标签号保存到UserDefaults(使用我的@propertyWrapper @UserDefault)。
2)重新启动此应用程序后,将通过UserDefaults中选定的选项卡编号自动选择tabItem。

问题:单击tabItem时没有任何效果。
能给我一些建议或正确的方法吗?
谢谢

enter image description here

我的@propertyWrapper

@propertyWrapper
struct UserDefault<T> {
    let key: String
    let value: T

    init(key: String, value: T) {
        self.key = key
        self.value = value
    }

    var wrappedValue: T {
        get {
            return UserDefaults.standard.value(forKey: self.key) as? T ?? self.value
        }
        set {
            UserDefaults.standard.set(newValue, forKey: self.key)
        }
    }
}

struct UserDefaultsConfig {
    @UserDefault(key: "SelectedTab", value: 0) static var selectedTab: Int
}

SwiftUI视图

struct ContentView: View {
    @State var selectedTab = UserDefaultsConfig.selectedTab
    var body: some View {
        TabView(selection: self.$selectedTab) {
            Text("Tab0 Content")
                .tabItem {
                    Text("Tab0")
                }.tag(0)

           Text("Tab1 Content")
                .tabItem {
                    Text("Tab1")
                }.tag(1)

            Text("Tab2 Content")
                .tabItem {
                    Text("Tab2")
                }.tag(2)

            Text("Tab3 Content")
                .tabItem {
                    Text("Tab3")
                }.tag(3)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

@State var selectedTab = UserDefaultsConfig.selectedTab

仅提供从UserDefaults读取的selectedTab的初始值,但永远不会将其保存回去。

理论上,您需要将@UserDefault(key: "SelectedTab", value: 0)直接应用于var selectedTab,但是现在不支持多个属性包装器。

下面给出了您期望的行为

struct ContentView:查看{

var body: some View {
    TabView(selection: Binding<Int>(get: { UserDefaultsConfig.selectedTab },
                                    set: {UserDefaultsConfig.selectedTab = $0} )) {
        Text("Tab0 Content")
            .tabItem {
                Text("Tab0")
            }.tag(0)
        ...