当用户单击正确答案时,如何使 quizView 以绿色 onTapGesture 显示

Posted

技术标签:

【中文标题】当用户单击正确答案时,如何使 quizView 以绿色 onTapGesture 显示【英文标题】:How can I make the quizView appear in green onTapGesture when the user clicks the right answer 【发布时间】:2020-08-26 23:11:57 【问题描述】:

我正在制作一个语言应用程序,并希望用户点击它后正确答案显示为绿色,但我正在努力做到这一点。

这是我想要实现此行为的代码部分。

            Grid(viewModel.answers)  answer in
                
                //how can i change the ui of quizView(answer) that is being tapped inside the closure
                quizView(answer: answer).onTapGesture 
                    if self.viewModel.chooseAnswer(answer: answer)
                        self.dim.toggle()
                        self.disabled.toggle()
                        print("a")
                        
                    
                
                .opacity(self.dim ? 0.4 : 1.0)
                .animation(.easeInOut(duration: 1.0))
                .disabled(self.disabled)
            
        
        .edgesIgnoringSafeArea([.top])
    


struct quizView: View 
var answer: LearnModel.Answer

var body: some View
    

    GeometryReader  geometry in
        ZStack

            answerBubble
            Text(self.answer.word.EnglishWord)
                .multilineTextAlignment(.center)
                .foregroundColor(Color.white)
        
    

var answerBubble: some View 
RoundedRectangle(cornerRadius: 20)
    .fill(Color.black)
    .shadow(color: Color.black, radius: 20, y: 5)
    .opacity(0.2)
    .padding()

Grid(viewModel.answers) - 为答案气泡创建 Grid 和 Gridlayout。

界面截图

【问题讨论】:

【参考方案1】:

您的answerBubble 是您尝试更新的视图。所以,这个视图需要有某种类型的参数来改变它的填充颜色。

假设如果用户点击正确的答案,背景变为绿色,如果没有点击,则保持黑色,否则变为红色。我会在你的主视图中创建一个有状态的点击答案列表:

@State private var tappedAnswers = [LearnModel.Answer]()

这将创建一个您可以跟踪的空答案列表。一旦用户点击了quizView,那么你应该将它添加到列表中,如果它还没有的话(你真的可以用Set 来做到这一点,但我坚持使用数组是因为它熟悉)。

quizView(answer: answer).onTapGesture 
    // Add the new answer to the list of tapped answers
    if !tappedAnswers.contains(answer) 
        tappedAnswers.append(answer)
    
    // Do any animation work you need in here

我不熟悉您的应用程序的其余部分,但您需要存储正确答案并将其与所选答案进行比较。我们暂时称它为correctAnswer

现在您可以添加一个函数来确定每个answerBubble 的适当填充颜色:

func colorFor(answer: LearnModel.Answer, correctAnswer: LearnModel.Answer) -> Color 

   if answer == correctAnswer 
       // Check for correct answer right away; order matters here.
       return Color.green
    else if tappedAnswers.contains(correctAnswer) 
       // The user tapped the answer, but it wasn't correct.
       return Color.red
    else 
       // The user hasn't tapped this answer yet.
       return Color.black
   


最后,向answerBubble 添加一个参数,该参数接受一个fillColor 变量,让您可以传入这个新创建的颜色方法(尽管您需要将其设为正确的SwiftUI 视图)。

struct AnswerBubble: View 

    let fillColor: Color

    var body: some View 
        RoundedRectangle(cornerRadius: 20)
            .fill(fillColor)
            .shadow(color: Color.black, radius: 20, y: 5)
            .opacity(0.2)
            .padding()
    


还要确保将fillColor 传递给quizView,因为它需要将它传递给answerBubble。现在您可以在 ForEach 循环中使用它。添加参数后,它应该如下所示:

quizView(
    answer: answer, 
    fillColor: self.colorFor(
        answer: answer, 
        correctAnswer: correctAnswer
    )
)

(另外,考虑将quizView 重命名为QuizView,因为它不是变量)

我不知道您的LearnModel 的详细信息,但您应该可以根据需要进行调整。

【讨论】:

以上是关于当用户单击正确答案时,如何使 quizView 以绿色 onTapGesture 显示的主要内容,如果未能解决你的问题,请参考以下文章

当用户点击正确答案时如何播放声音

单击检查按钮时如何删除/删除按钮文本?

当用户单击视图的背景时,如何使键盘消失?

如何使选择输入出现在点击

如何将按钮的颜色更改为默认颜色

单击登录后如何重定向到下一页并检查用户凭据是不是正确