我正在使用SwiftUI为macOS创建TabView。
希望
1)用户单击tabItem时,会将选定的标签号保存到UserDefaults(使用我的@propertyWrapper @UserDefault
)。
2)重新启动此应用程序后,将通过UserDefaults中选定的选项卡编号自动选择tabItem。
问题:单击tabItem时没有任何效果。
能给我一些建议或正确的方法吗?
谢谢
@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
}
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)
}
}
}
答案 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)
...