Ios 如何限制字符数,同时只允许文本字段中的字符子集?

Ios 如何限制字符数,同时只允许文本字段中的字符子集?,ios,swift,swiftui,textfield,Ios,Swift,Swiftui,Textfield,我一直在努力限制我可以在SwiftUI的文本字段中输入的字符数,同时只允许数字 我尝试了基于和的混合解决方案 要过滤字符,请执行以下操作: @Published var myString: String = "" { willSet { if newValue.count > Constants.maxLimit { myString = String(newValue.prefix(Constants.maxLimit)

我一直在努力限制我可以在SwiftUI的文本字段中输入的字符数,同时只允许数字

我尝试了基于和的混合解决方案

要过滤字符,请执行以下操作:

@Published var myString: String = "" {
    willSet {
        if newValue.count > Constants.maxLimit {
            myString = String(newValue.prefix(Constants.maxLimit))
        }
    }
}
以限制字符数

但通过这种方法,我仍然可以添加超过
常量.maxLimit
,并添加数字以外的字符

如果我尝试将这两种逻辑组合到视图模型中的
willSet/didSet
,或文本字段中的
onReceive
,则会出现堆栈溢出导致的崩溃


我在SwiftUI还是个新手,所以我不确定定制发布服务器是否能帮我解决这个问题。

您可以简单地过滤所有整数字符,并获得结果字符串的前10个字符。您还需要检查字符串是否为空,并将值设置回零:



您可以简单地过滤所有整数字符,并获得结果字符串的前10个字符。您还需要检查字符串是否为空,并将值设置回零:



你就不能这么做吗
.onReceive(Just(viewModel.myString)){newValue-in-let-filtered=newValue.filter{“0123456789”.contains($0)}如果filtered!=newValue,filtered.count您就不能这样做吗?:
.onReceive(Just(viewModel.myString)){newValue-in-let-filtered=newValue.filter{“0123456789”.contains($0)}如果filtered!=newValue,filtered.count是的,这对我来说很有用。有没有办法将此逻辑移动到视图模型?是的,这对我来说很有用。有没有办法将此逻辑移动到视图模型?
@Published var myString: String = "" {
    willSet {
        if newValue.count > Constants.maxLimit {
            myString = String(newValue.prefix(Constants.maxLimit))
        }
    }
}
import SwiftUI
import Combine

struct ContentView: View {
    @State private var text = "0"
    let maxLength = 10
    var body: some View {
        TextField("", text: $text)
            .keyboardType(.numberPad)
            .onReceive(Just(text)) {
                guard !$0.isEmpty else {
                    self.text = "0"
                    return
                }
                if let value = Int($0.filter(\.isWholeNumber).prefix(maxLength)) {
                    self.text = String(value)
                }
        }
    }
}