每次在swiftUI上向后和向前导航时初始化类

vcirk6k6  于 2023-01-29  发布在  Swift
关注(0)|答案(1)|浏览(135)

我有这个navigationStack它有许多NavigationLinks到游戏菜单的用户可以选择游戏玩。这个菜单由导航链接以及导致某种类型的游戏。游戏菜单看起来像这样:

struct GameMenuView: View {
    @Environment(\.presentationMode) var mode: Binding<PresentationMode>
    
    var body: some View {
        VStack{
            ButtonGame(game_name: "Title", view: AnyView(GameScreen(game: NewGame(count: 4, category: "All"))))
            ButtonGame(game_name: "Title", view: AnyView(GameScreen(game: NewGame(count: 6, category: "2"))))
            ButtonGame(game_name: "Title", view: AnyView(GameScreen(game: NewGame(count: 4, category: "None"))))
            ButtonGame(game_name: "Title", view: AnyView(GameScreen(game: NewGame(count: 4, category: "Basic"))))
        }
    }
}

ButtonGame只是一个结构体,它接受NavigationLink应该指向的视图。游戏屏幕的视图接受NewGame类,该类处理所有的游戏逻辑和统计数据。这一切都工作正常。但是我发现每次我从主菜单导航到游戏菜单时,所有这4个NewGame类都被初始化,并且当从GameMenu导航到实际的GameView时,所有NewGame类都被初始化再来一次。当我从游戏视图导航回游戏菜单视图时也会发生同样的事情。
这会导致不必要的数据加载,也会导致每次你离开游戏视图时游戏都会丢失状态。如何才能最好地处理这个问题?这样特定的游戏只有在按下按钮时才会初始化,并且当导航回游戏菜单时不会导致所有内容再次重新加载?

zpjtge22

zpjtge221#

在Swift(和SwiftUI)中,我们使用structs而不是类来处理模型数据。数据总是事先准备好的,存储在@State中,然后body使用数据来创建视图。因此,只需将Game更改为如下的structs:

struct Game: Identifiable {
    let id = UUID()
    let count: Int
    let category: String

}

struct GameMenuView: View {
    @Environment(\.presentationMode) var mode: Binding<PresentationMode>
    
    @State var games = [Game(count: 4, category: "All"), Game(count: 6, category: "2"), Game(count: 4, category: "None"), Game(count: 4, category: "Basic")]

    var body: some View {
        List {
            ForEach($games) { $game in
                ButtonGame(gameName: "Title", game: $game)
            }
        }
    }
}

struct ButtonGame: View {

    @Binding var game: Game

相关问题