轻松地将可自定义的屏蔽文本输入字段集成到 SwiftUI 应用程序中

MaskedTextFieldSwiftUI

MaskedTextFieldSwiftUI 软件包使用户能够轻松地在他们的 SwiftUI 应用程序中集成可定制的掩码文本输入字段。带掩码的文本字段为用户提供一种按照特定格式(如电话号码、日期或信用卡号)输入数据的结构化方式,同时保持干净直观的用户体验。

308523024-6449d31f-d4f6-45bf-88d6-febd0c9e121f

主要功能

  • 灵活的掩码:定义自定义掩码以指定用户输入的数据格式,从而精确控制数据格式。

  • 输入验证:根据指定掩码自动验证用户输入,确保仅接受和处理有效数据。

  • 占位符支持:提供占位符指导用户输入的预期格式,提高可用性并减少错误。

  • 动态格式化:根据用户输入或应用程序要求对掩码进行动态更新,无缝适应各种场景。

  • 自定义选项:自定义带掩码文本字段的外观和行为,以符合应用程序的设计语言和用户偏好。

  • 与 SwiftUI 集成:将带掩码文本字段组件无缝集成到 SwiftUI 视图,利用 SwiftUI 的声明式语法构建用户界面。

无论您是构建用于收集用户信息的表单、实现支付处理系统还是创建任何其他数据输入界面,SwiftUI 带掩码文本字段软件包都为强制执行数据格式一致性和增强 SwiftUI 应用程序中的用户输入体验提供了可靠的解决方案。

安装

要求

  • iOS 15.0+

通过 Swift 包管理器

在 Xcode 中,在你的项目中,选择:文件 > Swift 包 > 添加包依赖项,然后粘贴 URL https://github.com/darealkhan/MaskedTextFieldSwiftUI.git 并继续将其下载。

如何使用

若要使用 MaskedTextFieldSwiftUI,您需要遵循以下简单步骤。

  1. 将包导入您的项目。
import MaskedTextFieldSwiftUI
  1. 创建两个状态变量以接收文本字段中的更改。rawText 将包含屏蔽文本中的已清除文本。您也可以在需要时使用 maskedText
@State var rawText = ""
@State var maskedText = ""
  1. 创建 MaskType 以指定掩码的类型。maskString 参数是一个用输入的字符替换掩码字符的字符串。分隔符用于从带掩码文本中获取原始文本,因此分隔符中的每个字符都将在原始文本中被删除。最后,maskChar 参数指定用于屏蔽的字符。
let mastType = MaskType(
    maskString: "####-####-####-####",
    seperators: [
        .emptySpace,
        .customSeperator("-")
    ],
    maskChar: "#"
)
  1. 创建一个 MaskedTextFieldConfig 以自定义文本字段相关设置。有许多选项可供您自定义;在下面,我将列出所有选项,您可以选择要自定义的选项。
设置 类型
placeHolder 字符串
attributedPlaceholder NSAttributedString
font UIFont
textColor UIColor
keyboardType UIKeyboardType
autocorrectionType UITextAutocorrectionType
autocapitalizationType UITextAutocapitalizationType

例如,让我们创建一个带占位符的简单配置。

let config = MaskedTextFieldConfig(
    placeHolder: "Card Number"
)
  1. 最后,创建一个带有掩码文本和原始文本作为绑定变量的文本字段,以及配置和掩码类型设置。
 MaskedTextField(
    rawText: $rawTest,
    maskedText: $maskedTest,
    maskType: maskType,
    config: config
)

示例

也可以在软件包文件中找到有关如何使用 MaskedTextFieldSwiftUI 的真实示例

import Foundation
import MaskedTextFieldSwiftUI
import SwiftUI

struct ContentView: View {
    @State private var testFields = TestField.getFields()
    
    var body: some View {
        NavigationView {
            List($testFields) { field in
                Section(field.maskType.wrappedValue.maskString) {
                    textFieldTestView(with: field)
                }
            }
            .navigationTitle("Masked TextField 🎭")
        }
    }
    
    private func textFieldTestView(
        with field: Binding<TestField>
    ) -> some View {
        VStack {
            MaskedTextField(
                rawText: field.rawText,
                maskedText: field.maskedText,
                maskType: field.maskType.wrappedValue,
                config: field.config.wrappedValue
            )
            
            Divider()
            
            Text("Raw text is: \(field.rawText.wrappedValue)")
                .font(.caption)
                .foregroundStyle(.secondary)
                .frame(
                    maxWidth: .infinity,
                    alignment: .leading
                )
            
            Text("Masked text is: \(field.maskedText.wrappedValue)")
                .font(.caption)
                .foregroundStyle(.secondary)
                .frame(
                    maxWidth: .infinity,
                    alignment: .leading
                )
        }
    }
}

struct TestField: Identifiable {
    let id = UUID()
    var rawText = ""
    var maskedText = ""
    var config: MaskedTextFieldConfig
    var maskType: MaskType
    
    static func getFields() -> [TestField] {
        return [
            .init(
                config: MaskedTextFieldConfig(
                    placeHolder: "Credit Card Number"
                ),
                maskType: .init(
                    maskString: "####-####-####-####",
                    seperators: [
                        .emptySpace,
                        .customSeperator("-"),
                    ]
                )
            ),
            .init(
                config: MaskedTextFieldConfig(
                    placeHolder: "Number"
                ),
                maskType: .init(
                    maskString: "(###)-###-##-##",
                    seperators: [
                        .emptySpace,
                        .customSeperator("("