是否可以将最大长度设置为TextField
?我曾考虑使用onEditingChanged
事件处理它,但它只在用户开始/完成编辑时被调用,而在用户键入时不被调用.我也看过文件,但还没有找到任何东西.有什么解决办法吗?
TextField($text, placeholder: Text("Username"), onEditingChanged: { _ in
print(self.$text)
}) {
print("Finished editing")
}
是否可以将最大长度设置为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)
}
}
您只需要为TextField字符串提供一个ObservableObject
包装器.可以把它想象成一个解释器,每次有更改时都会收到通知,并且能够将修改发送回文本字段.但是,不需要创建PassthroughSubject
,使用@Published
修饰符将在更少的代码中获得相同的结果.
首先,你需要使用didSet
,而不是willSet
,否则你可能会陷入一个递归循环.