轻松地将可自定义的屏蔽文本输入字段集成到 SwiftUI 应用程序中
MaskedTextFieldSwiftUI
MaskedTextFieldSwiftUI 软件包使用户能够轻松地在他们的 SwiftUI 应用程序中集成可定制的掩码文本输入字段。带掩码的文本字段为用户提供一种按照特定格式(如电话号码、日期或信用卡号)输入数据的结构化方式,同时保持干净直观的用户体验。
主要功能
-
灵活的掩码:定义自定义掩码以指定用户输入的数据格式,从而精确控制数据格式。
-
输入验证:根据指定掩码自动验证用户输入,确保仅接受和处理有效数据。
-
占位符支持:提供占位符指导用户输入的预期格式,提高可用性并减少错误。
-
动态格式化:根据用户输入或应用程序要求对掩码进行动态更新,无缝适应各种场景。
-
自定义选项:自定义带掩码文本字段的外观和行为,以符合应用程序的设计语言和用户偏好。
-
与 SwiftUI 集成:将带掩码文本字段组件无缝集成到 SwiftUI 视图,利用 SwiftUI 的声明式语法构建用户界面。
无论您是构建用于收集用户信息的表单、实现支付处理系统还是创建任何其他数据输入界面,SwiftUI 带掩码文本字段软件包都为强制执行数据格式一致性和增强 SwiftUI 应用程序中的用户输入体验提供了可靠的解决方案。
安装
要求
- iOS 15.0+
通过 Swift 包管理器
在 Xcode 中,在你的项目中,选择:文件 > Swift 包 > 添加包依赖项
,然后粘贴 URL https://github.com/darealkhan/MaskedTextFieldSwiftUI.git 并继续将其下载。
如何使用
若要使用 MaskedTextFieldSwiftUI
,您需要遵循以下简单步骤。
- 将包导入您的项目。
import MaskedTextFieldSwiftUI
- 创建两个状态变量以接收文本字段中的更改。
rawText
将包含屏蔽文本中的已清除文本。您也可以在需要时使用maskedText
。
@State var rawText = ""
@State var maskedText = ""
- 创建
MaskType
以指定掩码的类型。maskString
参数是一个用输入的字符替换掩码字符的字符串。分隔符用于从带掩码文本中获取原始文本,因此分隔符中的每个字符都将在原始文本中被删除。最后,maskChar
参数指定用于屏蔽的字符。
let mastType = MaskType(
maskString: "####-####-####-####",
seperators: [
.emptySpace,
.customSeperator("-")
],
maskChar: "#"
)
- 创建一个
MaskedTextFieldConfig
以自定义文本字段相关设置。有许多选项可供您自定义;在下面,我将列出所有选项,您可以选择要自定义的选项。
设置 | 类型 |
---|---|
placeHolder | 字符串 |
attributedPlaceholder | NSAttributedString |
font | UIFont |
textColor | UIColor |
keyboardType | UIKeyboardType |
autocorrectionType | UITextAutocorrectionType |
autocapitalizationType | UITextAutocapitalizationType |
例如,让我们创建一个带占位符的简单配置。
let config = MaskedTextFieldConfig(
placeHolder: "Card Number"
)
- 最后,创建一个带有掩码文本和原始文本作为绑定变量的文本字段,以及配置和掩码类型设置。
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("("