Ios 如何限制字符数,同时只允许文本字段中的字符子集?
我一直在努力限制我可以在SwiftUI的文本字段中输入的字符数,同时只允许数字 我尝试了基于和的混合解决方案 要过滤字符,请执行以下操作: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)
@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)
}
}
}
}