一尘不染

SwiftUI TextField最大长度

swift

可以为设置最大长度TextField吗?我当时正在考虑使用onEditingChanged事件来处理它,但仅在用户开始/完成编辑时才调用它,而在用户键入时不调用它。我也阅读了文档,但还没有找到任何东西。有什么解决方法吗?

TextField($text, placeholder: Text("Username"), onEditingChanged: { _ in
  print(self.$text)
}) {
  print("Finished editing")
}

阅读 492

收藏
2020-07-07

共1个答案

一尘不染

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修饰符创建,只需较少的代码即可得到相同的结果。

提到一句,鉴于我们在不需要的时候覆盖了文本,因此您需要使用didSet,而不必使用,willSet否则可能会导致递归循环。

2020-07-07