繁体   English   中英

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

[英]How to set textfield character limit SwiftUI?

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

struct ContentView: View {
    @ObservedObject var textBindingManager = TextBindingManager(limit: 5)        
    var body: some View {
        TextField("Placeholder", text: $textBindingManager.phoneNumber)
    }
}

无需在您发布的属性上使用 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))
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

class TextBindingManager: ObservableObject {
    let characterLimit: Int
    @Published var phoneNumber = ""
    init(limit: Int = 10){
        characterLimit = limit
    }
}

此解决方案将所有内容包装在一个新组件中。 您可以调整它以非常轻松地执行其他解析/模式检查。

struct ContentView : View {
    @State private var myTextValue: String = ""
    
    var body: some View {
        LimitedTextField(value: $myTextValue, charLimit: 2)
    }
}


struct LimitedTextField : View {
    @State private var enteredString: String = ""
    @Binding var underlyingString: String
    let charLimit : Int
    
    init(value: Binding<String>, charLimit: Int) {
        _underlyingString = value
        self.charLimit = charLimit
    }
    
    var body: some View {
        HStack {
            TextField("", text: $enteredString, onCommit: updateUnderlyingValue)
                .onAppear(perform: { updateEnteredString(newUnderlyingString: underlyingString) })
                .onChange(of: enteredString, perform: updateUndelyingString)
                .onChange(of: underlyingString, perform: updateEnteredString)
        }
    }
    
    func updateEnteredString(newUnderlyingString: String) {
        enteredString = String(newUnderlyingString.prefix(charLimit))
    }
    
    func updateUndelyingString(newEnteredString: String) {
        if newEnteredString.count > charLimit {
            self.enteredString = String(newEnteredString.prefix(charLimit))
            underlyingString = self.enteredString
        }
    }
    
    func updateUnderlyingValue() {
        underlyingString = enteredString
    }
}

以下应该是最简单的。 它将字符数限制为 10。

struct ContentView: View {
    @State var searchKey: String = ""
    
    var body: some View {
        TextField("Enter text", text: $searchKey)
            .onChange(of: searchKey) { newValue in
                if newValue.count > 10 {
                    self.searchKey = String(newValue.prefix(10))
                }
            }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM