在没有 NumberFormatter 的情况下停止 TextField 中的字符重复
Posted
技术标签:
【中文标题】在没有 NumberFormatter 的情况下停止 TextField 中的字符重复【英文标题】:Stop character repetition in TextField without NumberFormatter 【发布时间】:2020-09-12 10:43:43 【问题描述】:例如,在文本字段中,我希望能够重复所有数字,但用户应该只能使用一次小数点。因此,用户不应该能够执行:“12...4”,而应该只能执行一次“12.4”。有什么特别的方法可以做到吗?不使用 UIKit 是否可以使用 SwiftUI 来做到这一点?
import SwiftUI
import Combine
struct TipsView: View
@State private var amount = ""
var body: some View
NavigationView
Form
Section (header: Text("Amount"))
HStack (spacing: 1)
Text("£")
TextField("Amount", text: $amount)
.onReceive(Just(amount)) _ in
【问题讨论】:
就我在您的案例中看到的预期行为(包括之前发布的)而言,最好退后一步并使用 UITextField+Delegate 完成所有这些操作,并将结果包装在 UIViewRepresentable 中。 听起来不错,谢谢 【参考方案1】:我使用了字符串分隔符将输入字符串分成两个不同的数组。意思是,一个数组包含小数点前的值,另一个数组包含小数点后的值。
import SwiftUI
struct DecimalView: View
@State private var amount = ""
var body: some View
Form
Section(header: Text("Amount"))
HStack
Text("£")
TextField("Enter amount", text: $amount)
.onChange(of: amount) _ in
let filtered = amount.filter "0123456789.".contains($0)
if filtered.contains(".")
let splitted = filtered.split(separator: ".")
if splitted.count >= 2
let preDecimal = String(splitted[0])
let afterDecimal = String(splitted[1])
amount = "\(preDecimal).\(afterDecimal)"
【讨论】:
小编辑。如果您使用let splitted = filtered.split(separator: ".", omittingEmptySubsequences: false)
,您可以避免同时使用多个小数点。以上是关于在没有 NumberFormatter 的情况下停止 TextField 中的字符重复的主要内容,如果未能解决你的问题,请参考以下文章
Swift3:类型 numberformatter 没有成员“货币样式”,swift3
如何在 SwiftUI 中使用 NumberFormatter?