2014-09-03 1 views
0

У меня есть функция, определяющая, должна ли форма быть отправлена ​​путем проверки возвращенного bool.Можно ли использовать метод UITextFieldDelegate внутри функции в swift?

Функция:

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, чтобы форма не была отправлена ​​с ошибками. Я бы тоже отключил кнопку отправки.

Out сторона выше функции я бы сделать что-то вроде этого:

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 и установить informationComplete var из-за пределов функции signUpViewController?

+0

Зачем вам нужно реализовать метод делегата текстового поля внутри другого метода? – Hokage

ответ

0

Ну, вам всегда нужно вызвать функцию на правильном объекте, в этом случае сам делегат. Так что, если делегат не самостоятельно, вы должны назвать его как

theDelegate.textFieldDidEndEditing(self.signUpView.usernameField) 

Обратите внимание, что вы также должны указать, какие TextField он.

Но настоящая проблема здесь структурная. Вы смущены тем, где можно проверить, что. Функции textFieldShouldEndEditing() и textFieldDidEndEditing() являются подходящим местом для проверки ввода данных в определенном поле. Если вам необходимо проверить комбинацию элементов, тогда проверка должна быть выполнена при сохранении. Но когда вы выполняете проверку при сохранении, нет необходимости вызывать методы делегирования textField, поскольку они уже будут выполняться.

Если вам нужно знать, что произошло, когда данные были введены в поле, вы используете переменную объекта, которую вы устанавливаете внутри методов делегата, которую вы можете проверить из метода сохранения. Вам никогда не придется снова обращаться к методам делегатов.

+0

Метод signUpViewController: shouldBeginSignUp проверяет комбинацию полей. Мне нужен способ проверить определенные поля, и именно поэтому я выбрал метод textFieldShouldEndEditing, чтобы при выходе из текстового поля текст, введенный в текстовое поле, был некорректным, появится предупреждение. – LondonGuy

+0

Нет проблем с использованием функции ShouldEndEditing для проверки каждого поля. Однако вам не нужно повторно проверять метод shouldBeginSignup. В чем смысл? На этом этапе уже проверены отдельные поля. – Rikkles

+0

Я нашел лучший способ сделать это. Я проверяю из метода signUpViewController. Я удалил оператор if, который отображает предупреждение и изменяет цикл for. См. Мой ответ и, пожалуйста, дайте свое мнение. – LondonGuy

0

Это то, что работает для меня:

// 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. Я удалил оператор if, который отображает предупреждение и модифицировал мой цикл for

+0

Это просто неправильно с точки зрения UX. Вы хотите, чтобы у пользователя была прямая обратная связь о том, что он делает. В приведенном выше вы, в лучшем случае, попросите пользователя повторить попытку 3 раза, чтобы исправить ошибки или добавить три предупреждения друг на друга. – Rikkles

 Смежные вопросы

  • Нет связанных вопросов^_^