点击另一个 TextField 时,SwiftUI TextField 不会提交更改

Posted

技术标签:

【中文标题】点击另一个 TextField 时,SwiftUI TextField 不会提交更改【英文标题】:SwiftUI TextField doesn't commit change when tapping another TextField 【发布时间】:2019-08-07 20:26:17 【问题描述】:

我目前正在我的应用程序中构建一些基本的表单功能,但在点击另一个 TextField 或在编辑模式下按“完成”时,我遇到了 TextFields 没有更改相关绑定变量中的值的问题。

    @Binding var jobDetails: JobDetails
    @Environment(\.colorScheme) var colorScheme: ColorScheme

    ...

    var body: some View 

       ...
                        HStack 
                            Text("Hourly Rate")
                            Spacer()
                            TextField("", value: $jobDetails.hourlyRateBasic, formatter: TextFormatters().currencyFormatter())

                                .keyboardType(.asciiCapableNumberPad)
                                .multilineTextAlignment(.trailing)
       ...

ios 模拟器中,该字段似乎只有在我输入新值(不是模拟器中的软键盘)后物理按下键盘上的返回键时才会更新。我希望 TextField 在点击另一个 TextField 或按“完成”退出编辑模式时将其更改为 jobDetails.hourlyRateBasic

当我点击另一个 TextField 时,onEditingChanged 似乎会触发,但我不知道如何利用它来将 jobDetails 更改为新值。

【问题讨论】:

‘JobDetails’ 是一个结构,所以我不相信我能按照你的建议去做。 .hourlyRateBasic 的类型是 Double?正如我所见,在其他一些资源中是必需的。编辑后在 TextField 上按 enter 时,jobDetails 的更新非常有效,这就是为什么我对它不更新感到困惑的原因。 jobDetails 有另一个属性,它是一个字符串,并且该属性的更新工作正常。我将在早上编辑我的答案以包含更多代码。感谢您的帮助。 我也看到了这一点,我认为根本问题是对于提供格式化程序的文本字段,格式化程序只有在返回时才会被调用。如果没有提供格式化程序,TextField 的值会随着每次按键而更新。而且由于该值未更新,因此即使在onEditingChanged 中,我也看不到任何获取用户输入的方法。再说一次,这是一个 SwiftUI 错误,我们希望很快能得到修复。 @KRH 关于格式化程序是正确的。在我看来,这确实是一个错误。我在格式化程序的isPartialStringValid(...) 方法中放置了一个断点,它从未被调用过。您应该提交错误报告。 谢谢两位,我感觉可能是这样。我会提交一个错误报告,希望它在 beta 6 中得到修复,并在解决后添加答案。 不要在这里继续猎巫。但是我对存储的 Double(即 4.87)也有同样的问题。当我在手机上渲染时,它看起来很好。但是,当我单击文本字段以编辑双值时;该值只会持续存在并且永远不会更新。 【参考方案1】:

这是 SwiftUI 中 TextField 的典型行为。以下是它的示例以及使 TextField 在键入时更具响应性的替代方法。

import SwiftUI

struct ContentView: View 
    @State private var text: String = "0"
    @State private var num: Int = 0
    private var resultString: String 
        if let num = Int(self.text) 
            return String(num*num)
        
        return "0"
    
    private var resultInt: Int 
        return self.num*self.num
    
    var body: some View 
        VStack 
            VStack(alignment:.leading) 
                Text("Input number as String")
                TextField("String Number",text: self.$text)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                Text("Input number as Int")
                TextField("Int Number", value: self.$num, formatter: NumberFormatter())
                .textFieldStyle(RoundedBorderTextFieldStyle())
            
            Spacer()
            Text("From String")
            Text("Square of \(self.text) is \(self.resultString)") .font(.title)
            Spacer()
            Text("From Int")
            Text("Square of \(self.num) is \(self.resultInt)") .font(.title)
            Spacer()
        .padding()
    

【讨论】:

这真的回答了这个问题吗?我看不出这对提交数字字段的更改有何帮助。

以上是关于点击另一个 TextField 时,SwiftUI TextField 不会提交更改的主要内容,如果未能解决你的问题,请参考以下文章

_PathPoint 类和 _PointQueue 类错误,不使用任何 pod。只需点击swiftui中的textField?

SwiftUI - 如何在另一个视图中响应 TextField onCommit?

SwiftUI:TextField 内的填充

问:Form 和 TextField [SwiftUI] 上的错误

如何检测何时点击 TextField? (MacOS 上的 SwiftUI)

有没有办法在编辑时将 TextField 的光标移动到文本的末尾?- SwiftUI