【问题标题】:NavigationLink with dynamic destinationNavigationLink 与动态目的地
【发布时间】:2020-05-27 02:04:33
【问题描述】:

我有一个带有 1 个按钮的屏幕,按下时会创建一个新游戏。它应该创建一个随机的游戏type,它将确定每次我按下New Game 时使用的颜色。问题是,一旦视图被加载,它永远不会在按下一次后更新以选择随机的新主题。我尝试创建一个@State var theme 并使用onAppear 重新渲染视图,但这似乎是一个黑客......

有没有办法正确动态加载导航链接?

struct NewGameView: View {

    @State var theme: EmojiMemoryGameTheme

    var body: some View {
        NavigationView {
            NavigationLink(destination: EmojiMemoryGameView(viewModel: EmojiMemoryGame(theme: theme))) {
                VStack {
                Text("New Game")
                    .font(Font.largeTitle)
                    .padding(.vertical, 10.0)
                    .padding(.horizontal, 40.0)
                    .background(Color.blue)
                    .cornerRadius(20.0)
                    .foregroundColor(Color.white)
                }

            }
            .navigationBarTitle("Memorize")
            .onAppear {
                self.newTheme()
            }
        }
    }

    func newTheme() {
        theme = EmojiMemoryGameTheme.allCases.randomElement() ?? .halloween
    }
}

【问题讨论】:

  • 你的目的是每次都按新游戏,也应该调用“新主题”的功能?
  • @SpencerReid 目的是每次进入游戏画面时生成一种新类型的游戏

标签: swiftui swiftui-navigationlink


【解决方案1】:

看看这个:

请尝试提供一个可重现的示例,如下所述https://stackoverflow.com/help/minimal-reproducible-example ;)

import SwiftUI

enum EmojiMemoryGameTheme : String, CaseIterable {
    case you
    case should
    case provide
    case a
    case reproducable
    case example
}

struct EmojiMemoryGame {

    var theme:EmojiMemoryGameTheme

}

struct EmojiMemoryGameView : View {

    var viewModel : EmojiMemoryGame

    var body: some View {

        Group {
            Text(viewModel.theme.rawValue)
        }
    }
}

struct ContentView: View {

    @State var theme: EmojiMemoryGameTheme

    var body: some View {
        NavigationView {
            NavigationLink(destination: EmojiMemoryGameView(viewModel: EmojiMemoryGame(theme:theme))) {
                VStack {
                    Text("New Game")
                        .font(Font.largeTitle)
                        .padding(.vertical, 10.0)
                        .padding(.horizontal, 40.0)
                        .background(Color.blue)
                        .cornerRadius(20.0)
                        .foregroundColor(Color.white)
                        .onAppear() {
                            self.theme = EmojiMemoryGameTheme.allCases.randomElement() ?? .a
                    }
                }
                .navigationBarTitle("Memorize")
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(theme: EmojiMemoryGameTheme.example)
    }
}

【讨论】:

  • 虽然这可行,但它仍然会在屏幕旋转时产生更新。这可能是 SwiftUI 中的错误吗?
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多