【问题标题】:Capture Textfield value without hitting return key in SwiftUI [duplicate]在 SwiftUI 中捕获文本字段值而不按返回键 [重复]
【发布时间】:2021-01-15 04:31:43
【问题描述】:

有没有办法在不按返回键的情况下捕获 TextField 中的值?我有一个 TextField,我想在不按返回键的情况下捕获值(年)。 仅当字段具有焦点或左焦点时才会触发 onEditingChanged onComit 仅在按下返回键时触发。

我正在查看的场景是,例如,当我在字段中输入“5”并点击“完成”时,我想捕获新值而不是现有值。

                    TextField("Number of Years...", value: $years, formatter: integerFormatter, onEditingChanged: { _ in
                        print("OnEditingChanged: \(years)")
                    },
                    onCommit: {
                        print("\(years)")
                    })

【问题讨论】:

标签: ios swift swiftui


【解决方案1】:

首先,添加@State变量'year':

@State private var year: Int = 0

其次,将 Binding 传递给 TextField 'text' 参数并在内部使用格式化程序,如下所示:

        TextField("Year", text: Binding<String>(
                get: { String(year) },
                set: {
                    if let value = NumberFormatter().number(from: $0) {
                        self.year = value.intValue
                        print("Year: \(year)")
                    }
                }
        ))

它将打印“年份”值,直到在键盘上按下数字以外的其他内容。 要只留下数字输入,您可以将 keyboardType 设置为 TextField:

.keyboardType(UIKeyboardType.numberPad)

【讨论】:

    【解决方案2】:

    编辑:显然使用 Formatters 的值不仅仅是实时更新。您可以尝试的一种模式是让文本字段设置一个 @State 字符串并让 .onChange 触发一个格式化函数……或者让一个 get/set Binding 为您运行该函数。

    通过这种方式,任何退出视图的按钮都可以从用户输入中提取实时原始字符串,并将该字符串设置为您想要的任何格式化版本。

    如果焦点改变是个问题,你可以从:https://www.youtube.com/watch?v=SYBmMugnol0&feature=emb_rel_pause

    =============

    所以,teehee,你可能会笑,但你已经开始工作了。

    添加

    .onChange(of: years) { print($0) }
    

    你就会明白我的意思了。 @State 属性已经在为您提供实时提要。如果您使用 Combine 来驱动某种处理管道,您可能需要去重和去抖动。抱歉,如果您不是初学者并且我刚刚写的内容很迂腐。

    【讨论】:

    • 我认为这会起作用,但由于某种原因它不会触发 onChange 关闭。不知道为什么
    • 这很奇怪。它现在在 SwiftUI MacOS 应用程序上为我打印。按下按钮打印状态变量也是如此。
    • 你在使用“onEditingChanged”吗?这只是开始和停止编辑的布尔值。 .onChange 是一个单独的函数,应用于该视图中的任何位置。
    • 我没有使用onEditingChanged,我把它改成了.onChange。你检查过IOS模拟器吗?
    • 啊,你的块是格式化程序。我以前不知道这种行为,因为我通过 VM 应用格式化程序,或者仅在提交时应用。更新答案。
    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多