Ios Swift3:验证用户在UITextField中输入的文本的最佳方法
晚上,在我的应用程序中,我有几个Ios Swift3:验证用户在UITextField中输入的文本的最佳方法,ios,swift,validation,uitextfield,Ios,Swift,Validation,Uitextfield,晚上,在我的应用程序中,我有几个UITextfield。每个人都必须确认不同的限制 例如,我有一个日期字段、zipCode字段、SSN字段等 从苹果的文档中,我发现: 指定代理对象以处理重要任务,例如: 确定是否应允许用户编辑文本字段的内容 正在验证用户输入的文本 响应键盘返回按钮中的点击 将用户输入的文本转发到应用程序的其他部分 在一个控制器对象中存储对文本字段的引用 所以我很确定我必须使用委托和func textfielddidediting(:) 我想到的唯一方法是在func
UITextfield
。每个人都必须确认不同的限制
例如,我有一个日期字段、zipCode字段、SSN字段等
从苹果的文档中,我发现:
指定代理对象以处理重要任务,例如:
- 确定是否应允许用户编辑文本字段的内容
- 正在验证用户输入的文本
- 响应键盘返回按钮中的点击
- 将用户输入的文本转发到应用程序的其他部分
- 在一个控制器对象中存储对文本字段的引用
func textfielddidediting(:)
我想到的唯一方法是在func textfielddidediting(:)
中使用switch
语句来确认委托是否符合差异限制
有更好、更安全、更快的模式来解决这个问题吗?你是对的,你必须检查文本字段,或者你可以像你说的那样使用switch语句检查为不同文本字段分配的标记, 或者你可以比较文本字段本身 如果textfield1、textfield2是两个文本字段的输出,您可以进行如下比较:
func textFieldDidEndEditing(textField: UITextField)
{
if textField == textfield1
{
}
else if textField == textfield2
{
}
}
您可以为每个文本字段设置唯一的
标记
,并可以在textfielddendediting
中进行比较,也可以在textfielddendediting
中对每个文本字段进行IBOutlet
比较
func textFieldDidEndEditing(textField: UITextField) {
// By tag
if textField.tag == 100 {
}
// OR
//by outlet
if textField == self.myTextField {
}
}
您可以创建用于验证的枚举
enum Type {
case zipcode
case number
}
然后您可以创建一个验证方法,如下所示:
func isValidate(text: String, type: Type) -> Bool {
switch type {
case .zipcode:
...
}
}
此方法可以位于Util类中。这是最佳做法。因为您的逻辑是从外封装的。如果您需要对提交到文本字段的文本进行更多的控制,或者如果您希望在编辑文本字段时提供反馈,您应该实现不同的委托:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// Build and check the new text value. Accept or reject the change.
}
在委托中,您可以构建新的文本
值。验证、应用约束、决定用户应收到的反馈(“您的密码必须至少有八个字符”、“这不是有效的IBAN”)、接受或拒绝更改(即返回false
)
请记住,如果手动指定
文本
属性,则不会调用委托。此外,当文本被粘贴到文本字段或从文本字段中删除时,会调用此委托,这会使事情变得更加复杂,具体取决于您的操作。我认为,使用switch语句区分文本字段的标记就是一种方法。@MauriceA。谢谢,这正是我所想的,让我们看看是否有人能给我们一个其他的模式非常感谢。我会选择这个解决方案。谢谢你,科坦,我不知道标签!在我的回答中,我展示了两种方法,带标签和不带标签。第二件事标签不好
意味着什么?这是毫无意义的声明。如果不好,为什么sdk会提供呢?或者你是基于什么理由这么说的?谢谢Farhad,但是已经声明了Outlet,我认为使用它们比创建新的枚举更快。