2014-09-03 75 views
0

我有一個函數通過檢查返回的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

回答

0

那麼你總是需要調用函數正確的對象上,在這種情況下,委託本身。所以,如果委託沒有自我,你必須調用它像

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

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方法中進行驗證。我刪除了聲明,如果顯示警告,修改了我的for循環

+0

從用戶體驗角度來看,這只是錯誤的。你希望用戶對他在做什麼有直接的反饋。在上面,您最多可讓用戶重試3次以修復錯誤,或者將3次警報疊加在一起。 – Rikkles 2014-09-03 16:54:07

相關問題