SwiftUI 的新手......我有以下簡化代碼。預期的功能是能夠在View1()和之間導航View2(),使用單例類來跟蹤此導航。
我懷疑也許我需要添加@Published到我的show_view_2變數中,但我想將它保存在 App Storage 中。另外,我知道這不是在視圖之間切換的最佳方式,但我只使用這種方法,因為它是一個最少復制的示例。
為什么下面的代碼不起作用,我怎樣才能使它起作用?
class Player {
static var player = Player()
@AppStorage("show_view_2") var show_view_2: Bool = false
}
struct ContentView: View {
var body: some View {
if(Player.player.show_view_2) {
View2()
} else {
Text("Go to View2")
.onTapGesture {
Player.player.show_view_2 = true
}
}
}
}
struct View2: View {
var body: some View {
Text("Back to View1")
.onTapGesture {
Player.player.show_view_2 = false
}
}
}
uj5u.com熱心網友回復:
要讓 SwiftUI 知道要更新,Player應該是ObservableObject. 此外,它需要使用屬性包裝器(@StateObject或@ObservedObject)訪問View:
class Player : ObservableObject {
static var player = Player()
@AppStorage("show_view_2") var show_view_2: Bool = false
}
struct ContentView: View {
@StateObject private var player = Player.player
var body: some View {
if player.show_view_2 {
View2()
} else {
Text("Go to View2")
.onTapGesture {
player.show_view_2 = true
}
}
}
}
struct View2: View {
@StateObject private var player = Player.player
var body: some View {
Text("Back to View1")
.onTapGesture {
player.show_view_2 = false
}
}
}
一般來說,我建議不要使用單例,而是在視圖之間顯式傳遞物件的實體——隨著時間的推移,這將更加可測驗和靈活:
class Player : ObservableObject {
@AppStorage("show_view_2") var show_view_2: Bool = false
}
struct ContentView: View {
@StateObject private var player = Player()
var body: some View {
if player.show_view_2 {
View2(player: player)
} else {
Text("Go to View2")
.onTapGesture {
player.show_view_2 = true
}
}
}
}
struct View2: View {
@ObservedObject var player : Player
var body: some View {
Text("Back to View1")
.onTapGesture {
player.show_view_2 = false
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/410732.html
標籤:
