SwiftUI TextField 阻止输入某些字符?

kis*_*ues 4 ios swift

如何防止某些字符输入到我的 SwiftUI TextField 中,以便在输入不允许的字符时完全忽略或替换为“”。

我下面的代码仅通过指定要忽略的单个字符来工作,但在我的情况下,我需要能够指定许多允许的字符,而无需使用正则表达式(为了可读性)。

我试图使其基于现有的 SO 文章工作,但需要帮助如何通过将输入的每个新字符与一系列允许的字符进行比较来检查它。

TextField 还需要防止输入空格......

我读过很多关于此 NOT FOR SWIFTUI TEXTFIELDS 的文章,并且它们不容易用正则表达式理解。

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
    }
    
}

Run Code Online (Sandbox Code Playgroud)

Don*_*Mag 8

这是一种方法,使用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()
    }
}
Run Code Online (Sandbox Code Playgroud)