在 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 中捕获文本字段值而不按返回键 [重复]的主要内容,如果未能解决你的问题,请参考以下文章