2016-09-16 3 views
2

UIAlertController을 사용하여 사용자에게 5 자리 CRN을 입력하라는 대화 상자를 표시합니다. UITextField에 5 자리 숫자가 5 자릿수가 될 때까지 Add 버튼을 사용하지 못하게하고 싶습니다.UIAlertController의 UITextField에 따라 UIAlertAction을 비활성화하는 방법은 무엇입니까?

다음
var alertController: UIAlertController! 

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

내가 viewDidLoad 방법을 초기화하고있어 방법은 다음과 같습니다 :

여기 enter image description here

UIAlertController에 대한 속성 설정이있다 : 여기

는 같은 UI가 어떻게 표시되는지를 보여줍니다
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 
} 

여기에 있습니다. 내가하지 않도록하기 위해 노력하고있어 승 /를 UITextFieldDelegate 방법을 사용하여 버튼을 활성화합니다

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

그러나, 버튼이 비활성화 (또는 사용) 모든 시간이 남아있다. 활성화되지 않습니다. 무슨 일있어?

+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; 

} 

은 엑스 코드 8 테스트 및 신속한 3. 나를 위해 일했다.

관련 문제