简体   繁体   English

SwiftUI TextField 阻止输入某些字符?

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

How can I prevent certain characters from being entered into my SwiftUI TextField so that when a un-allowed character is entered it is completely ignored or replaced with "".如何防止某些字符输入到我的 SwiftUI 文本字段中,以便在输入不允许的字符时将其完全忽略或替换为“”。

My code below only works by specifying a single character to ignore but I need to be able to specify many allowed characters without using a regex in my case (for readability).我下面的代码只能通过指定要忽略的单个字符来工作,但我需要能够在不使用正则表达式的情况下指定许多允许的字符(为了便于阅读)。

I was trying to make it work based on existing SO articles but need assistance with how to check every new character as it is entered by comparing it to a range of allowed characters.我试图根据现有的 SO 文章使其工作,但需要帮助如何通过将输入的每个新字符与一系列允许的字符进行比较来检查它。

The TextField would also need to prevent spaces from being entered... TextField 还需要防止输入空格...

I have read a lot of SO articles on this NOT FOR SWIFTUI TEXTFIELDS AND they are not easily understood with regex expressions.我已经阅读了很多关于此 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
    }
    
}

Here is one approach, using Combine :这是一种方法,使用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