如何向用户刷新问题?
How do I refresh the question to the user?
我目前正在 Swift UI 完成 100 天的代码,我想我在第 25 天的挑战中已经完成了 99%。然而,我的大脑现在是一团粉红色的糊状物,我很难过。
我正在尝试刷新(或重绘)向用户显示两条信息的两个文本视图。我考虑过洗牌 (.shuffled()) 石头剪刀布数组,但我相信我的 if 语句使用数组位置会使我的逻辑在接下来的几轮中无效。
所以我试图在用户关闭警报时将 Int.random(int...int) 重写为变量 aiChooses 和 playerShould,但我 运行 各种问题。
任何 help/ideas 非常感谢。
import SwiftUI
struct ContentView: View {
let rockPaperScissors = ["Rock", "Paper", "Scissors"]
let winLose = ["Win", "Lose"]
var aiChooses = Int.random(in: 0...2)//<-- trying to update when user dismisses alert
var playerShould = Int.random(in: 0...1)//<-- trying to update when user dismisses alert
@State private var userAnswer = 0
@State private var alertVisible = false
@State private var score = 0
@State private var scoreTitle = ""
@State private var moreInfo = ""
var body: some View {
VStack {
Spacer()
Text("I choose \(rockPaperScissors[aiChooses])") //<-- Trying to get this to pull in a new value when alert dismissed
Text("You should \(winLose[playerShould])") //<-- Trying to get this to pull in a new value when alert dismissed
Spacer()
HStack {
Spacer()
Section {
Button(action: {
// your action here
self.playerTapped(playerChose: 0, winning: self.playerShould)
}) {
Text("Rock")
}
Spacer()
Button(action: {
// your action here
self.playerTapped(playerChose: 1, winning: self.playerShould)
}) {
Text("Paper")
}
Spacer()
Button(action: {
// your action here
self.playerTapped(playerChose: 2, winning: self.playerShould)
}) {
Text("Scissors")
}
Spacer()
}
.alert(isPresented: $alertVisible) {
Alert(title: Text(scoreTitle), message: Text(moreInfo), dismissButton: .default(Text("Ok")) {
self.nextRound() //<--- call func (below) to refresh starting question
})
}
}
// Picker("Choose Win or Lose", selection: $userAnswer){
// ForEach(0..<rockPaperScissors.count){
// Text(self.rockPaperScissors[[=10=]])
// }
// }
// .pickerStyle(SegmentedPickerStyle())
Spacer()
Text("Score: \(score)")
}
}
func playerTapped(playerChose: Int, winning: Int) {
let aiChose = aiChooses
let rock = 0
let paper = 1
let scissors = 2
if winning == 0 {
if playerChose == aiChose {
// score == score
scoreTitle = "Draw!"
moreInfo = "You seleted the same as me!"
}
else if playerChose == rock && aiChose == paper {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You seleted Rock, I picked Paper!"
}
else if playerChose == rock && aiChose == scissors {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You seleted Rock, I picked Scissors!"
}
else if playerChose == paper && aiChose == scissors {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You seleted Paper, I picked Scissors!"
}
else if playerChose == paper && aiChose == rock {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected Paper, I selected Rock!"
}
else if playerChose == scissors && aiChose == paper {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You seleted Scissors, I picked Paper!"
}
else if playerChose == scissors && aiChose == rock {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You selected Scissors, I selected Rock!"
}
// trying to lose
else if winning == 1 {
if playerChose == aiChose {
// score == score
scoreTitle = "DRAW!"
moreInfo = "You seleted the same as me!"
}
else if playerChose == rock && aiChose == paper {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == rock && aiChose == scissors {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == paper && aiChose == scissors {
score += 1
scoreTitle = "CORRECT"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == paper && aiChose == rock {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You selected the right answer, which is WRONG!"
}
else if playerChose == scissors && aiChose == paper {
score += 1
scoreTitle = "CORRECT"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == scissors && aiChose == rock {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
}
}
alertVisible = true
}
func nextRound() { // <-- when alert is dismissed, update vars for top two text views to update
aiChooses = Int.random(in: 0...2)
playerShould = Int.random(in: 0...1)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
如果你想让 SwiftUI 在 属性 改变时 update/redraw 一个视图,你需要把它变成 @State
属性:
@State var aiChooses = Int.random(in: 0...2)
@State var playerShould = Int.random(in: 0...1)
我目前正在 Swift UI 完成 100 天的代码,我想我在第 25 天的挑战中已经完成了 99%。然而,我的大脑现在是一团粉红色的糊状物,我很难过。
我正在尝试刷新(或重绘)向用户显示两条信息的两个文本视图。我考虑过洗牌 (.shuffled()) 石头剪刀布数组,但我相信我的 if 语句使用数组位置会使我的逻辑在接下来的几轮中无效。
所以我试图在用户关闭警报时将 Int.random(int...int) 重写为变量 aiChooses 和 playerShould,但我 运行 各种问题。
任何 help/ideas 非常感谢。
import SwiftUI
struct ContentView: View {
let rockPaperScissors = ["Rock", "Paper", "Scissors"]
let winLose = ["Win", "Lose"]
var aiChooses = Int.random(in: 0...2)//<-- trying to update when user dismisses alert
var playerShould = Int.random(in: 0...1)//<-- trying to update when user dismisses alert
@State private var userAnswer = 0
@State private var alertVisible = false
@State private var score = 0
@State private var scoreTitle = ""
@State private var moreInfo = ""
var body: some View {
VStack {
Spacer()
Text("I choose \(rockPaperScissors[aiChooses])") //<-- Trying to get this to pull in a new value when alert dismissed
Text("You should \(winLose[playerShould])") //<-- Trying to get this to pull in a new value when alert dismissed
Spacer()
HStack {
Spacer()
Section {
Button(action: {
// your action here
self.playerTapped(playerChose: 0, winning: self.playerShould)
}) {
Text("Rock")
}
Spacer()
Button(action: {
// your action here
self.playerTapped(playerChose: 1, winning: self.playerShould)
}) {
Text("Paper")
}
Spacer()
Button(action: {
// your action here
self.playerTapped(playerChose: 2, winning: self.playerShould)
}) {
Text("Scissors")
}
Spacer()
}
.alert(isPresented: $alertVisible) {
Alert(title: Text(scoreTitle), message: Text(moreInfo), dismissButton: .default(Text("Ok")) {
self.nextRound() //<--- call func (below) to refresh starting question
})
}
}
// Picker("Choose Win or Lose", selection: $userAnswer){
// ForEach(0..<rockPaperScissors.count){
// Text(self.rockPaperScissors[[=10=]])
// }
// }
// .pickerStyle(SegmentedPickerStyle())
Spacer()
Text("Score: \(score)")
}
}
func playerTapped(playerChose: Int, winning: Int) {
let aiChose = aiChooses
let rock = 0
let paper = 1
let scissors = 2
if winning == 0 {
if playerChose == aiChose {
// score == score
scoreTitle = "Draw!"
moreInfo = "You seleted the same as me!"
}
else if playerChose == rock && aiChose == paper {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You seleted Rock, I picked Paper!"
}
else if playerChose == rock && aiChose == scissors {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You seleted Rock, I picked Scissors!"
}
else if playerChose == paper && aiChose == scissors {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You seleted Paper, I picked Scissors!"
}
else if playerChose == paper && aiChose == rock {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected Paper, I selected Rock!"
}
else if playerChose == scissors && aiChose == paper {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You seleted Scissors, I picked Paper!"
}
else if playerChose == scissors && aiChose == rock {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You selected Scissors, I selected Rock!"
}
// trying to lose
else if winning == 1 {
if playerChose == aiChose {
// score == score
scoreTitle = "DRAW!"
moreInfo = "You seleted the same as me!"
}
else if playerChose == rock && aiChose == paper {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == rock && aiChose == scissors {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == paper && aiChose == scissors {
score += 1
scoreTitle = "CORRECT"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == paper && aiChose == rock {
score -= 1
scoreTitle = "WRONG!"
moreInfo = "You selected the right answer, which is WRONG!"
}
else if playerChose == scissors && aiChose == paper {
score += 1
scoreTitle = "CORRECT"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
else if playerChose == scissors && aiChose == rock {
score += 1
scoreTitle = "CORRECT!"
moreInfo = "You selected the wrong answer, which is RIGHT!"
}
}
}
alertVisible = true
}
func nextRound() { // <-- when alert is dismissed, update vars for top two text views to update
aiChooses = Int.random(in: 0...2)
playerShould = Int.random(in: 0...1)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
如果你想让 SwiftUI 在 属性 改变时 update/redraw 一个视图,你需要把它变成 @State
属性:
@State var aiChooses = Int.random(in: 0...2)
@State var playerShould = Int.random(in: 0...1)