如何制作一个改变屏幕视图的条件按钮?

How to make a conditional button that changes the screen view?

我是 Swift 的新手,但我正在尝试制作一款简单的二十一点游戏。我有一个 HIT 按钮,每次都会将一张牌添加到玩家的手上并增加玩家的总分。但我还想向 HIT 按钮添加一个条件,即如果玩家的总数超过 21,则会出现一个新屏幕,其中显示文本“你输了”。但是,我无法获得打开另一个视图的按钮。

我起初想将 HIT 按钮更改为 NavigationView 但后来我不知道在哪里添加 ifBust 条件,所以我认为创建一个新的 .swift 文件并在 [=23 中调用文件名会更好=]if 语句,这似乎也不起作用。

我有一个 isBust 函数,如果玩家得分超过 21,returns 为真:

func isBust(score:Int) -> Bool {
 if (score > 21) {
  return true
 }
 return false
}

在另一个 swift 文件中,我有标题为“LooserView.swift”的“你输了”屏幕。

import SwiftUI
struct LosserVew: View {
 var body: some View {
  Text("You loose!")
 }
}
struct LooserView_Previews: PreviewProvider {
 static var previews: some View {
  LooserView()
 }
}

最后,我有 HIT 按钮:

// action = deals 1 card to player and increases player count then checks if player is bust

Button(action:{
 let randomSuit:String = suits[Int.random(in:0 ...  3)] 
  // calls the 'suit' array, and returns a random suit: clubs, diamonds, hearts, or spades
 let randomNumb:Int = Int.random(in: 1 ... 13) // calls a random card number
 playerCard = String(randomSuit) + String(randomNumb) // updates the player's card
 playerScore += randomNumb // adds to the player's current score

 if (isBust(score: playerScore)) {
  // if true, meaning the player's score is over 21, load the "You Lose" screen
 }
}, label: {
Text("HIT")
})

我想我找到了我自己问题的答案。首先,我需要在文件中添加一个选择变量 nil(也意味着 null?)作为其值。

struct ContentView: View {
 @State private var selection:String? = nil
  var body: some View {}
}

请注意 ContentView 只是 .swift 文件的名称。

然后,我需要在 .swift 文件的正文中插入一个 NavigationView

struct ContentView: View {
 var body: some View {
  NavigationView {
   // the body/design of the code
  } // End of NavView
 }
}

接下来,我需要在代码的“设计”中添加一个 NavigationLink(即:在第一个 Z、H 或 VStack 下)。并在导航中附加一个标签link。因此,当我更新选择以匹配标签时,它会导致适当的 NavigationLink 激活。

struct ContentView: View {
 var body: some View {
  NavigationView {
   // the body/design of the code
   ZStack() {
    NavigationLink(destination: LooserView(), tag: "A", selection: $selection) {}
    // destination = LooserView.swift file, the tag of the nav-link is called "A"
   }
  }
 }
}

最后,在 ifBust 条件的 HIT 按钮中,我将选择更新为 A if ifBust returns true (a.k.a: 得分超过21).

if (isBust(score: playerScore)) {
 selection = "A"
}

How to use programmatic navigation in SwiftUI <- 这篇文章对我解决这个问题帮助很大