NavigationLink с динамикой c пункт назначения - PullRequest
0 голосов
/ 27 мая 2020

У меня есть экран с 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
    }
}

1 Ответ

0 голосов
/ 27 мая 2020

проверьте это:

попробуйте предоставить воспроизводимый пример, как описано здесь { ссылка } в следующий раз;)

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)
    }
}
...