2017-08-22 14 views
0

私は2つのテキストフィールドを持つViewControllerを持っています。 View ControllerはUITextFieldDelegateです。私はこのフィールドから値をチェックし、有効であれば、このView Controllerボタンからの戻り値を有効にします。問題は、2番目の文字から検証が始まることです。各フィールドに値を入力しようとすると、2番目の文字を入力するまでボタンが非アクティブになりますが、入力した後にこの文字を削除すると戻ります。問題が発生したのはcheckIfAddingAvailable()です。どこが間違っているの?テキストフィールドがまだSwift UITextFieldは2番目の文字からテキストをチェックします

を最終テキストを持っていないので、

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    guard let oldTextString = textField.text else { 
     return true 
    } 
    let oldText = oldTextString as NSString 
    let newString = oldText.replacingCharacters(in: range, with: string) as NSString 

    if newString.length > 0 { 
     let _ = checkIfAddingAvailable() 
    } else { 
     addFoodButton.isEnabled = false 
    } 
    return true 
} 

func checkIfAddingAvailable() -> Bool { 
    //TODO: implement valid checking of posibility to add food 
    guard let foodName = foodNameField.text else { return false } 
    guard !foodName.isEmpty else { 
     return false 
    } 

    guard let foodShelfLife = shelfLifeField.text else { return false } 
    guard !foodShelfLife.isEmpty else { 
     return false 
    } 
    guard let foodShelfLifeIntoDouble = Double(foodShelfLife) else { return false } 
    guard foodShelfLifeIntoDouble > 0 else { 
     return false 
    } 
    addFoodButton.isEnabled = true 
    return true 
} 
+0

checkIfAddingAvailableにnewString Stringを渡す必要があります –

答えて

1

あなたはshouldChangeCharactersInでcheckIfAddingAvailableにNEWSTRING渡す必要があり、あなたのテキストフィールドが

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     guard let oldTextString = textField.text else { 
      return true 
     } 
     let oldText = oldTextString as NSString 
     let newString = oldText.replacingCharacters(in: range, with: string) as NSString 

     if newString.length > 0 { 
      let _ = checkIfAddingAvailable(newString) 
     } else { 
      addFoodButton.isEnabled = false 
     } 
     return true 
    } 

    func checkIfAddingAvailable(_ foodNameFieldText :String) -> Bool { 
     //TODO: implement valid checking of posibility to add food 
     guard let foodName = foodNameFieldText else { return false } 
     guard !foodName.isEmpty else { 
      return false 
     } 

     guard let foodShelfLife = shelfLifeField.text else { return false } 
     guard !foodShelfLife.isEmpty else { 
      return false 
     } 
     guard let foodShelfLifeIntoDouble = Double(foodShelfLife) else { return false } 
     guard foodShelfLifeIntoDouble > 0 else { 
      return false 
     } 
     addFoodButton.isEnabled = true 
     return true 
    } 
+0

ありがとう。私は両方のテキストフィールドから同時に値をチェックする必要があるので、私はすでに、文字列とテキストフィールドの両方が置き換えられた後、変更されたフィールドとこれからの値をチェックした後、この問題を解決しています。最初にこのメソッドを呼び出し、それ以降はtextField.textに新しい値を渡します。 –

+0

はい、私は上記のように言いました。 –

0

あなたのコードでこのメソッドを追加してくださいためのコードを調整します。

func textFieldDidEndEditing(textField: UITextField) { 
    if textField == yourTextFieldName { 
     if textField.text?.characters.count > 0 { 
      let _ = checkIfAddingAvailable() 
     } else { 
      addFoodButton.isEnabled = false 
     } 
    } 
} 
+0

私はこのフィールドを編集中に同時に両方のテキストフィールドの値をチェックしなければならず、テキストフィールドが最初のレスポンダステータスを終了した後にこのメソッドが呼び出されます。 –

+0

あなたはすべての文字タイプの変更方法を探していますか、削除していますか? –

+0

すべての文字に:ユーザーが2番目のtextFieldへのデータ入力を開始し、最初のテキストフィールドのデータがすでに入力されている場合、doneボタンが有効になります。 –

関連する問題