在没有 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?

numberformatter(样式货币)删除不起作用

NumberFormatter 在 Swift 中无法识别来自不同本地的数字 [关闭]

NumberFormatter 分组未按预期工作

使用 numberFromString 生成 NSDecimalNumber 时如何在没有分数错误的情况下获得舍入值?