在 SwiftUI 中捕获文本字段值而不按返回键 [重复]

Posted

技术标签:

【中文标题】在 SwiftUI 中捕获文本字段值而不按返回键 [重复]【英文标题】:Capture Textfield value without hitting return key in SwiftUI [duplicate] 【发布时间】: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)")
                    )

【问题讨论】:

这是否回答了您的问题***.com/a/59509242/12299030? @Asperi,我希望我们有一个 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 应用格式化程序,或者仅在提交时应用。更新答案。

以上是关于在 SwiftUI 中捕获文本字段值而不按返回键 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 文本字段返回键事件

在 SQL 查询中使用文本字段值而不提交它

不按Shift键即可翻译输入文本字段

我可以在 lambda 中使用 constexpr 值而不捕获它吗?

按返回键“不”关闭软件键盘 - SwiftUI

在 JS 哈希中按频率获取一个值而不丢失其他键和值