Swift3:验证用户在UITextField中输入的文本的最佳方法

时间:2016-08-23 12:58:10

标签: ios swift validation uitextfield

晚上,在我的应用中,我有几个UITextfield。每个人都必须确认不同的限制。

例如,我有一个日期字段,zipCode字段,SSN字段等。

从Apple文档中我发现:

  

分配委托对象以处理重要任务,例如:

     
      
  • 确定是否允许用户编辑文本字段的内容。

  •   
  • 验证用户输入的文本。

  •   
  • 响应键盘返回按钮的点按。

  •   
  • 将用户输入的文字转发到应用的其他部分。

  •   
  • 在一个控制器对象中存储对文本字段的引用。

  •   

所以我非常确定我必须使用委托和func textFieldDidEndEditing(_:)

我想到的唯一方法是在switch内使用func textFieldDidEndEditing(_:)语句来确认代表的差异限制。

是否有更好,更安全,更快速的模式来解决这个问题?

4 个答案:

答案 0 :(得分:1)

你是对的,你必须检查文本字段,你可以使用switch语句检查分配给不同文本字段的标签,就像你说的那样, 或者你可以比较文本字段本身,

如果textfield1,textfield2是两个文本字段的出口,则可以比较如下,

func textFieldDidEndEditing(textField: UITextField)
{
  if textField == textfield1
  {

  } 
  else if textField == textfield2
  {

  } 
}

答案 1 :(得分:1)

您可以为每个文字字段设置唯一的tag,并且可以在textFieldDidEndEditing中进行比较,也可以在每个textField中进行IBOutlet,并且可以在textFieldDidEndEditing中进行比较,例如,

 func textFieldDidEndEditing(textField: UITextField) {

    // By tag
    if textField.tag == 100  {

    }

    // OR

    //by outlet
    if textField == self.myTextField {


    }
}

答案 2 :(得分:1)

您可以创建验证枚举

enum Type {
   case zipcode
   case number
}

然后您可以创建一个验证方法,如下所示:

func isValidate(text: String, type: Type) -> Bool {
    switch type {
    case .zipcode:
        ...
    }
}

此方法可以在Util类中。这是最好的做法。因为你的逻辑是从外面封装的。

答案 3 :(得分:1)

如果您需要更多地控制提交到文本字段的文本,或者如果您想在编辑文本字段时提供反馈,则应该实现另一个代理:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // Build and check the new text value. Accept or reject the change.
}

在委托中,您可以构建新的text值。验证它,应用约束,决定用户应该收到哪些反馈("您的密码必须至少长8个字符","这不是有效的IBAN"),接受或拒绝变化(即返回false)。

请注意,如果手动分配text属性,则委托。此外,当文本被粘贴到文本字段或从文本字段中删除时,会调用此委托,这可能会使事情变得更加复杂,具体取决于您的操作。