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,我认为使用它们比创建新的枚举更快。