如何向用户刷新问题?

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)

【讨论】:

以上是关于如何向用户刷新问题?的主要内容,如果未能解决你的问题,请参考以下文章

当用户使用返回键从任何其他页面返回页面时如何刷新页面?

如何快速刷新所有视图控制器

刷新页面时如何防止表单重新提交(F5 / CTRL+R)

在 SwiftUI 中,如何向列表添加滚动刷新功能?

Firestore + Vue:刷新页面时,如何避免数据显示延迟?

如何在客户端(vue.js)实现自动刷新?