【问题标题】:SwiftUI - Textfield return key eventSwiftUI - 文本字段返回键事件
【发布时间】:2021-06-15 05:26:34
【问题描述】:

首先,很抱歉我的英语不是很完美。

我想根据通过文本字段中的返回键接收到的值的条件显示不同的图像。我搜索并尝试了几种方法,但找不到正确的方法。我在 SwiftUI 中找不到合适的返回键事件,所以我尝试了 onReceive。

快速文件。

struct QuestionItemView: View {

    @State private var question: Question?
    @State private var answer = ""

    var body: some View {
        VStack(spacing: 30) {
            GroupBox {
                if let question = question {
                    Text(question.question)
                        .font(.largeTitle)
                        .fontWeight(.heavy)
                        .scaledToFit()
                        .frame(width: 300, height: 100)
                        .cornerRadius(12)
                }
            }
        
            GroupBox {
                TextField("Enter your answer", text: $answer)
                    .frame(width: 300)
                    .font(.title2)
                    .scaledToFit()
                    .cornerRadius(12)
                    .multilineTextAlignment(.center)
           }
         
            onReceive(answer.publisher) { _ in
                if answer == question?.answer {
//                        Image(systemName: "circle")
                    print("o")
                } else {
//                        Image(systemName: "multiply")
                    print("x")
                }
            }
        } //: VStack
        .frame(width: 240)
        .background(RoundedRectangle(cornerRadius: 7.0).fill(Color.white))
        .onAppear {
            let questions: [Question] = Bundle.main.decode("questions.json")
            question = questions.randomElement()
        }
    }
}

json.file

[
    {
        "id" : 1,
        "question" : "2 X 6",
        "answer" : "12"
    },
    {
        "id" : 2,
        "question" : "7 + 8",
        "answer" : "15"
    },
    {
        "id" : 3,
        "question" : "9 - 1",
        "answer" : "8"
    },
    {
        "id" : 4,
        "question" : "4 / 2",
        "answer" : "2"
    },
    {
        "id" : 5,
        "question" : "10 X 2",
        "answer" : "20"
    }
]

【问题讨论】:

    标签: swiftui textfield


    【解决方案1】:

    你可以试试这样的:

    struct QuestionItemView: View {
        
        @State private var question: Question?
        @State private var answer = ""
        @State private var imgType = ""
        
        var body: some View {
            VStack(spacing: 30) {
                GroupBox {
                    if let question = question {
                        Text(question.question)
                            .font(.largeTitle)
                            .fontWeight(.heavy)
                            .scaledToFit()
                            .frame(width: 300, height: 100)
                            .cornerRadius(12)
                    }
                }
                
                GroupBox {
                    TextField("Enter your answer", text: $answer)
                        .frame(width: 300)
                        .font(.title2)
                        .scaledToFit()
                        .cornerRadius(12)
                        .multilineTextAlignment(.center)
                        .onSubmit {  // <--- only on pressing the return key
                    //  .onChange(of: answer) { _ in  // <-- as you type
                    //  .onReceive(answer.publisher) { _ in  // <-- as you type
                        if answer == question?.answer {
                            imgType = "circle"
                            print("o")
                        } else {
                            imgType = "multiply"
                            print("x")
                        }
                    }
                }
                
                if imgType == "circle" {
                    Image(systemName: "circle")
                } else {
                    Image(systemName: "multiply")
                }
    
            }
            .frame(width: 240)
            .background(RoundedRectangle(cornerRadius: 7.0).fill(Color.white))
            .onAppear {
                let questions: [Question] = Bundle.main.decode("questions.json")
                question = questions.randomElement()
            }
        }
    }
    

    如果您使用的是旧系统,您可能需要这样做:

            TextField("Enter your answer", text: $answer, onCommit: {
                if answer == question?.answer {
                    imgType = "circle"
                    print("o")
                } else {
                    imgType = "multiply"
                    print("x")
                }
            })
    

    【讨论】:

    • 在 onSumbit 中出现错误“'some View' 类型的值没有成员 'onSubmit'”?
    • 是的,您可能使用的是 macOS 11.x 和 ios 14.x。 "onSubmit" 仅在 macos 12 和 ios 15 上可用。在这种情况下,您需要使用 TextField (..., onCommit: ...
    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2020-01-27
    • 2021-03-26
    • 2022-12-15
    相关资源
    最近更新 更多