【问题标题】:Swift @propertyWrapper in SwiftUISwiftUI 中的 Swift @propertyWrapper
【发布时间】:2020-04-05 11:15:55
【问题描述】:


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

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

我的@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)
        }
    }
}

【问题讨论】:

标签: swiftui


【解决方案1】:

这个

@State var selectedTab = UserDefaultsConfig.selectedTab

只为从 UserDefaults 读取的selectedTab 提供初始值,但从不将其保存回来。

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

以下给出了您期望的行为

struct ContentView: View {

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多