如何制作一个改变屏幕视图的条件按钮?
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 <- 这篇文章对我解决这个问题帮助很大
我是 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 <- 这篇文章对我解决这个问题帮助很大