是否可以在swift中的函数中使用UITextFieldDelegate方法?

问题描述:

我有一个函数通过检查返回的bool来确定是否应该提交表单。是否可以在swift中的函数中使用UITextFieldDelegate方法?

功能:

func signUpViewController(signUpController: PFSignUpViewController!, shouldBeginSignUp info: [NSObject : AnyObject]!) -> Bool { 
    var informationComplete = true 

    // loop through all of the submitted data 
    for (key, value) in info { 
     let fieldValue: AnyObject? = value 

     if (!fieldValue || fieldValue?.length == 0) { // check completion 
      informationComplete = false; 
      break; 
     } 
    } 

    // is this possible 
    textFieldDidEndEditing(textField: UITextField?) { 

    } 



    // Display an alert if a field wasn't completed 
    if (!informationComplete) { 

     var alert = UIAlertController(title: "Error", message: "Make sure you fill out all of the fields!", preferredStyle: UIAlertControllerStyle.Alert) 
     alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)) 
     self.presentViewController(alert, animated: true, completion: nil) 


    } 

    PFUser.logOut() 
    return informationComplete; 
} 

现在我检查空字段,但需要检查其他的东西,如在文本字段中的文本量,无论是电子邮件地址已被正确输入。

我想用textFieldDidEndEditing已经离开后,检查文本字段的内容。我将基本上使用if语句来执行检查,然后显示错误消息,但也会将informtionComplete设置为false,以便不会提交任何错误。我可能也会禁用提交按钮。

上述功能我会做这样的事情的输出端:

override func textFieldDidEndEditing(textField: UITextField!) { 
    if textField == self.signUpView.usernameField { 
     var length = countElements(self.signUpView.usernameField.text!) 
     if length < 2 { 
      var alert = UIAlertController(title: "Error", message: "Your company can only have a minimum of 2 characters!", preferredStyle: UIAlertControllerStyle.Alert) 
      alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)) 
      self.presentViewController(alert, animated: true, completion: nil) 
      self.signUpView.signUpButton.enabled = false 
     } else { 
      self.signUpView.signUpButton.enabled = true 
     } 
    } 

    if textField == self.signUpView.passwordField { 

    } 

    if textField == self.signUpView.emailField { 

    } 

} 

可以类似的功能内进行或者我需要设置实例瓦尔就像我会在Objective-C并从signUpViewController函数的外部设置informationComplete var?

+0

为什么你需要实现内部的另一种方法文本框的委托方法? – Hokage 2014-09-03 12:48:37

那么你总是需要调用函数正确的对象上,在这种情况下,委托本身。所以,如果委托没有自我,你必须调用它像

theDelegate.textFieldDidEndEditing(self.signUpView.usernameField) 

请注意,您还必须指定文本框它。

但这里真正的问题是结构性的。你在哪里检查什么是困惑的。 textFieldShouldEndEditing()textFieldDidEndEditing()函数是验证特定字段上的数据输入的正确位置。如果您需要验证项目的组合,则验证需要在保存时完成。但是当你检查保存时,不需要调用textField委托方法,因为这些方法已经运行了。

如果你需要知道什么时候数据字段输入了什么事,那你就用你的委托方法,您可以从保存的方法检查内部设置的对象变量。你不应该直接再次调用委托方法。

+0

signUpViewController:shouldBeginSignUp方法验证字段的组合。我需要一种方法来检查特定的字段,这就是为什么我选择了textFieldShouldEndEditing方法,以便当文本字段中输入的文本不正确时,如果我离开文本字段,将会出现警告。 – LondonGuy 2014-09-03 13:11:54

+0

使用ShouldEndEditing来验证每个字段没有问题。但是,您不应该从shouldBeginSignup方法重新验证。重点是什么?在那个阶段,单个字段已经被验证。 – Rikkles 2014-09-03 13:13:26

+0

我找到了一个更好的方法来做到这一点。我从signUpViewController方法中进行验证。我删除了显示警报的if语句并修改了我的for循环。看到我的回答,请给出你的意见。 – LondonGuy 2014-09-03 13:20:19

这是为我工作:

// loop through all of the submitted data 
for (key, value) in info { 
    let fieldValue: AnyObject? = value 

    if (!fieldValue || fieldValue?.length == 0) { // check completion 
     informationComplete = false; 
     break; 
    } else if (countElements(self.signUpView.usernameField.text!) < 2) { 
     NSLog("signup field text less than 2") 
     // display alert 
     informationComplete = false 
    } else if (self.signUpView.passwordField) { 
     NSLog("password error ") 
     // display alert 
     informationComplete = false 
    } 
} 

我从signUpViewController方法中进行验证。我删除了声明,如果显示警告,修改了我的for循环

+0

从用户体验角度来看,这只是错误的。你希望用户对他在做什么有直接的反馈。在上面,您最多可让用户重试3次以修复错误,或者将3次警报叠加在一起。 – Rikkles 2014-09-03 16:54:07