如何解决SwiftUI如何在保持TextField最大长度的同时更新模型
我的项目中具有以下结构:
ContentView
PhoneView
UnderscoredTextField
ActivationView
UnderscoredTextField
UnderscoredTextField
UnderscoredTextField
UnderscoredTextField
我在两个不同的视图中使用此UnderscoredTextField
,每个视图中允许使用的字符数不同且出于不同的目的,一个用于电话号码,第二个用于验证码。
因此,我使用了this answer中的代码来限制每个文本字段中的字符数
class TextBindingManager: ObservableObject {
@Published var text = "" {
didSet {
if text.count > characterLimit && oldValue.count <= characterLimit {
text = oldValue
}
}
}
let characterLimit: Int
init(limit: Int = 5){
characterLimit = limit
}
}
这是我的UnderscoredTextField
的样子:
struct UnderscoredTextField: View {
@State var isActive: Bool = false
@State var fromPhonescreen: Bool
@Observedobject var textBindingManager: TextBindingManager
var body: some View {
vstack {
TextField("",text: self.$textBindingManager.text,onEditingChanged: {
self.isActive = $0
})
.keyboardType(.phonePad)
.titleStyle()
.onTapGesture {
self.isActive = true
}
Divider()
.padding(.horizontal)
.frame(height: 1)
.background(isActive ? ColorManager.Primary : ColorManager.Gray200)
}
}
}
因此,我认为我可以在User
中拥有TextBindingManager
类的共享实例,就像这样:
class TextBindingManager: ObservableObject {
let characterLimit: Int
let user: User
let fromPhonescreen: Bool
@Published var text = "" {
didSet {
if text.count > characterLimit && oldValue.count <= characterLimit {
text = oldValue
}
if fromPhonescreen {
user.phoneNumber = oldValue
}
}
}
init(limit: Int = 1,userObj: User = User(),fromPhoneView: Bool = false) {
characterLimit = limit
user = userObj
fromPhonescreen = fromPhoneView
}
}
但是,如果我这样做,我的UnderscoredTextField
的{{1}}将不再起作用,即每个键入的数字都将被删除,并且如果我打印文本,则它仅包含最后一个键入的数字(但从视觉上将它们删除)
这就是我在TextField
中叫UnderscoredTextField
的方式
PhoneView
还有UnderscoredTextField(textBindingManager: TextBindingManager(limit: 10,userObj: self.user,fromPhoneView: true))
:
ActivationView
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。