如何设置文本字段字符限制 SwiftUI?

Sou*_*hra 3 validation textfield ios swift swiftui

我正在使用 SwiftUi 版本 2 进行应用程序开发。我遇到了 SwiftUI 中可用文本字段的问题。我不想再使用 UITextField 了。我想限制文本字段中的字符数。我搜索了很多,找到了一些与此相关的答案,但这些答案不适用于 SwiftUI 版本 2。

class textBindingManager: ObservableObject{
    let characterLimit: Int
    @Published var phoneNumber = "" {
        didSet {
            if phoneNumber.count > characterLimit && oldValue.count <= characterLimit {
                phoneNumber = oldValue
            }            
        }
    }
    init(limit: Int = 10) {
        characterLimit = limit
    }    
}
Run Code Online (Sandbox Code Playgroud)
struct ContentView: View {
    @ObservedObject var textBindingManager = TextBindingManager(limit: 5)        
    var body: some View {
        TextField("Placeholder", text: $textBindingManager.phoneNumber)
    }
}
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 5

无需在已发布的属性上使用 didSet。您可以向 TextField 添加修饰符,并将字符串值限制为其前缀限制为字符限制:

import SwiftUI

struct ContentView: View {
    @ObservedObject var textBindingManager = TextBindingManager(limit: 5)
    var body: some View {
        TextField("Placeholder", text: $textBindingManager.phoneNumber)
            .padding()
            .onChange(of: textBindingManager.phoneNumber, perform: editingChanged)
    }
    func editingChanged(_ value: String) {
        textBindingManager.phoneNumber = String(value.prefix(textBindingManager.characterLimit))
    }
}
Run Code Online (Sandbox Code Playgroud)
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Run Code Online (Sandbox Code Playgroud)
class TextBindingManager: ObservableObject {
    let characterLimit: Int
    @Published var phoneNumber = ""
    init(limit: Int = 10){
        characterLimit = limit
    }
}
Run Code Online (Sandbox Code Playgroud)