2016-09-16 4 views
2

私はUIAlertControllerを使用して、5桁のCRNを入力するダイアログをユーザに提示しています。 UITextFieldに5桁しかない場合は、Addボタンを無効にします。UIAlertControllerのUITextFieldに応じてUIAlertActionを無効にする方法はありますか?

はここUIは次のようになります。

enter image description here

ここUIAlertControllerのプロパティの設定です:

var alertController: UIAlertController! 

var addAlertAction: UIAlertAction! { 
    return UIAlertAction(title: "Add", style: .default) 
} 

は、ここで私はviewDidLoad方法でそれらを初期化しています方法です

self.alertController = UIAlertController(title: "Add Class", message: "Input CRN", preferredStyle: .alert) 
self.alertController.addAction(addAlertAction) 
self.alertController.addAction(UIAlertAction(title: "Cancel", style: .destructive)) 
self.alertController.addTextField { (textField) in 
    textField.delegate = self 
    textField.keyboardType = .numberPad 
} 

こちら

func textFieldDidEndEditing(_ textField: UITextField) { 
    if ((textField.text?.characters.count)! == 5) { 
     self.alertController.actions[0].isEnabled = true 
    } else { 
     self.alertController.actions[0].isEnabled = false 
    } 
} 

しかし、ボタンが無効(または有効)のまま、すべての時間:私はUITextFieldDelegateメソッドを使用してボタンを有効/無効にしようとしているwが。それは有効になることはありません。何がうまくいかないの?

+0

'textFieldDidBeginEditing'を試してみてください – Santosh

答えて

4

shouldChangeCharactersIn代理人方法のロジックをUITextFieldに実装します。このメソッドは、テキストフィールドの各文字の変更に基づいて起動します。 範囲パラメータを考慮してロジックを構築することができます。

完全に動作するコードは次のとおりです。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    if ((range.location == 4 && range.length == 0) || (range.location == 5 && range.length == 1)) { 
     self.alertController.actions[0].isEnabled = true 
    }else{ 
     self.alertController.actions[0].isEnabled = false 
    } 

    return true; 
} 
Swift 3で正常にテスト

XCode 8iOS 10

お役に立てば幸いです。 ハッピーコーディング...

1

次のようにテキストフィールドのEditingChangedイベントを使用してみてください:

let addAction:UIAlertAction = UIAlertAction(title: "Add", style: .default) 
addAction.isEnabled = false; //to make it disable while presenting 

self.alertController = UIAlertController(title: "Add Class", message: "Input CRN", preferredStyle: .alert) 
self.alertController.addAction(addAction) 
self.alertController.addAction(UIAlertAction(title: "Cancel", style: .destructive)) 
self.alertController.addTextField { (textField) in 
    textField.keyboardType = .numberPad 
    textField.addTarget(self, action: #selector(self.alertTextFieldDidChange(field:)), for: UIControlEvents.editingChanged) 
} 

、テキストフィールドのリスナーは、次のようになります

func alertTextFieldDidChange(field: UITextField){ 
    let alertController:UIAlertController = self.presentedViewController as! UIAlertController; 
    let textField :UITextField = alertController.textFields![0]; 
    let addAction: UIAlertAction = alertController.actions[0]; 
    addAction.isEnabled = (textField.text?.characters.count)! >= 5; 

} 

は、Xcodeの8でテストされ、迅速3.私のために働きました。

関連する問題