微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI如何在保持TextField最大长度的同时更新模型

如何解决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 举报,一经查实,本站将立刻删除。