如何向用户刷新问题?
Posted
技术标签:
【中文标题】如何向用户刷新问题?【英文标题】:How do I refresh the question to the user? 【发布时间】:2020-09-06 22:47:10 【问题描述】:我目前正在编写 100 天的 Swift UI 代码,我想我在第 25 天的挑战中完成了 99%。然而,我的大脑现在变成了粉红色的糊状,我被难住了。
我正在尝试刷新(或重绘)两个向用户呈现两条信息的文本视图。我考虑过改组 (.shuffled()) 石头、纸、剪刀数组,但我的 if 语句使用数组位置,这会使我的逻辑在接下来的几轮中无效。
所以当用户关闭警报时,我尝试将 Int.random(int...int) 重写为变量 aiChooses 和 playerShould,但我遇到了各种问题。
非常感谢任何帮助/想法。
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[$0])
//
//
// .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()
【问题讨论】:
【参考方案1】:如果您希望 SwiftUI 在属性更改时更新/重绘视图,则需要将其设为 @State
属性:
@State var aiChooses = Int.random(in: 0...2)
@State var playerShould = Int.random(in: 0...1)
【讨论】:
以上是关于如何向用户刷新问题?的主要内容,如果未能解决你的问题,请参考以下文章