可以为设置最大长度TextField吗?我当时正在考虑使用onEditingChanged事件来处理它,但仅在用户开始/完成编辑时才调用它,而在用户键入时不调用它。我也阅读了文档,但还没有找到任何东西。有什么解决方法吗?
TextField
onEditingChanged
TextField($text, placeholder: Text("Username"), onEditingChanged: { _ in print(self.$text) }) { print("Finished editing") }
Paulw11的答案稍短一些:
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 } } struct ContentView: View { @ObservedObject var textBindingManager = TextBindingManager(limit: 5) var body: some View { TextField("Placeholder", text: $textBindingManager.text) } }
您只需要一个ObservableObjectTextField字符串的包装即可。可以将其视为一个解释器,该解释器每次发生更改时都会得到通知,并且能够将修改发送回TextField。但是,无需PassthroughSubject使用@Published修饰符创建,只需较少的代码即可得到相同的结果。
ObservableObject
PassthroughSubject
@Published
提到一句,鉴于我们在不需要的时候覆盖了文本,因此您需要使用didSet,而不必使用,willSet否则可能会导致递归循环。
didSet
willSet