簡體   English   中英

SwiftUI TextField 阻止輸入某些字符?

[英]SwiftUI TextField prevent certain characters from being entered?

如何防止某些字符輸入到我的 SwiftUI 文本字段中,以便在輸入不允許的字符時將其完全忽略或替換為“”。

我下面的代碼只能通過指定要忽略的單個字符來工作,但我需要能夠在不使用正則表達式的情況下指定許多允許的字符(為了便於閱讀)。

我試圖根據現有的 SO 文章使其工作,但需要幫助如何通過將輸入的每個新字符與一系列允許的字符進行比較來檢查它。

TextField 還需要防止輸入空格...

我已經閱讀了很多關於此 NOT FOR SWIFTUI TEXTFIELDS 的 SO 文章,並且使用正則表達式不容易理解它們。

enum InputType {
    case username
    case code
}

struct AccountInput: View {
    let placeholder: String
    @Binding var input: String
    
    let inputType: InputType
 
    var body: some View {
        HStack {
            TextField(placeholder, text: $input)
                .onChange(of: input) { _ in
                    switch inputType {
                    case .username:
                        let allowedCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-"
                        let allowedCharacterSet = CharacterSet(charactersIn: allowedCharacters)
                        let typedCharacterSet = CharacterSet(charactersIn: input)
                        input = input.replacingOccurrences(of: ???, with: "")
                        // ^ HOW CAN I MODIFY THIS TO CHECK AND SEE IF CHARACTER IS CONTAINED IN ALLOWED CHARACTER SET AND IGNORE SPACES???
                    case .code:
                        let allowedCharacters = "0123456789"
                        let allowedCharacterSet = CharacterSet(charactersIn: allowedCharacters)
                        let typedCharacterSet = CharacterSet(charactersIn: input)
                        input = input.replacingOccurrences(of: " ", with: "")
                    }
                }
        }
    }

    init(placeholder: String, input: Binding<String>, inputType: InputType) {
        self.placeholder = placeholder
        self._input = Binding(projectedValue: input)
        self.inputType = inputType
    }
    
}

這是一種方法,使用Combine

import SwiftUI
import Combine

struct TextFiltering: View {

    @State private var userName = ""
    @State private var codeNumber = ""

    var body: some View {
        HStack {
            TextField("Username", text: $userName)
                .background(Color.cyan)
                .onReceive(Just(userName)) { newValue in
                    let allowedCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-"
                    let filtered = newValue.filter { allowedCharacters.contains($0) }
                    if filtered != newValue {
                        self.userName = filtered
                    }
                }
            Spacer()
            TextField("Code", text: $codeNumber)
                .background(Color.yellow)
                .onReceive(Just(codeNumber)) { newValue in
                    let allowedCharacters = "0123456789"
                    let filtered = newValue.filter { allowedCharacters.contains($0) }
                    if filtered != newValue {
                        self.codeNumber = filtered
                    }
                }
        }
    }

}

struct TextFiltering_Previews: PreviewProvider {
    static var previews: some View {
        TextFiltering()
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM