检查UIAlertController TextField是否启用button

我有一个AlertController与文本字段和两个button:取消和保存。 这是代码:

@IBAction func addTherapy(sender: AnyObject) { let addAlertView = UIAlertController(title: "New Prescription", message: "Insert a name for this prescription", preferredStyle: UIAlertControllerStyle.Alert) addAlertView.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: nil)) addAlertView.addAction(UIAlertAction(title: "Save", style: UIAlertActionStyle.Default, handler: nil)) addAlertView.addTextFieldWithConfigurationHandler({textField in textField.placeholder = "Title"}) self.presentViewController(addAlertView, animated: true, completion: nil) } 

我想要做的是实现一个文本框检查当禁用保存button,当文本框是空的就像图片应用程序的iOS,当你想创build一个NewAlbum。 请有人能解释我该怎么做?

我将首先创buildalertcontroller,最初禁用保存操作。 然后当添加文本字段包含一个通知来观察它在处理程序中的更改,并在该select器中,只需切换保存操作启用属性。

这就是我所说的:

 //hold this reference in your class weak var AddAlertSaveAction: UIAlertAction? @IBAction func addTherapy(sender : AnyObject) { //set up the alertcontroller let title = NSLocalizedString("New Prescription", comment: "") let message = NSLocalizedString("Insert a name for this prescription.", comment: "") let cancelButtonTitle = NSLocalizedString("Cancel", comment: "") let otherButtonTitle = NSLocalizedString("Save", comment: "") let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) // Add the text field with handler alertController.addTextFieldWithConfigurationHandler { textField in //listen for changes NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleTextFieldTextDidChangeNotification:", name: UITextFieldTextDidChangeNotification, object: textField) } func removeTextFieldObserver() { NSNotificationCenter.defaultCenter().removeObserver(self, name: UITextFieldTextDidChangeNotification, object: alertController.textFields[0]) } // Create the actions. let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .Cancel) { action in NSLog("Cancel Button Pressed") removeTextFieldObserver() } let otherAction = UIAlertAction(title: otherButtonTitle, style: .Default) { action in NSLog("Save Button Pressed") removeTextFieldObserver() } // disable the 'save' button (otherAction) initially otherAction.enabled = false // save the other action to toggle the enabled/disabled state when the text changed. AddAlertSaveAction = otherAction // Add the actions. alertController.addAction(cancelAction) alertController.addAction(otherAction) presentViewController(alertController, animated: true, completion: nil) } //handler func handleTextFieldTextDidChangeNotification(notification: NSNotification) { let textField = notification.object as UITextField // Enforce a minimum length of >= 1 for secure text alerts. AddAlertSaveAction!.enabled = textField.text.utf16count >= 1 } 

我正在做另一个项目 – 我直接从苹果的例子中得到这个模式。 他们有一个非常好的示例项目,概述了UICatalog示例中的一些模式: https : //developer.apple.com/library/content/samplecode/UICatalog/Introduction/Intro.html

没有使用通知中心,有一个更简单的方法,迅速:

Swar 3每回答Sourabh夏尔马:

 weak var actionToEnable : UIAlertAction? func showAlert() { let titleStr = "title" let messageStr = "message" let alert = UIAlertController(title: titleStr, message: messageStr, preferredStyle: UIAlertControllerStyle.alert) let placeholderStr = "placeholder" alert.addTextField(configurationHandler: {(textField: UITextField) in textField.placeholder = placeholderStr textField.addTarget(self, action: #selector(self.textChanged(_:)), for: .editingChanged) }) let cancel = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: { (_) -> Void in }) let action = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: { (_) -> Void in let textfield = alert.textFields!.first! //Do what you want with the textfield! }) alert.addAction(cancel) alert.addAction(action) self.actionToEnable = action action.isEnabled = false self.present(alert, animated: true, completion: nil) } func textChanged(_ sender:UITextField) { self.actionToEnable?.isEnabled = (sender.text! == "Validation") } 

Swift 2.0:

 weak var actionToEnable : UIAlertAction? func showAlert() { let titleStr = "title" let messageStr = "message" let alert = UIAlertController(title: titleStr, message: messageStr, preferredStyle: UIAlertControllerStyle.Alert) let placeholderStr = "placeholder" alert.addTextFieldWithConfigurationHandler({(textField: UITextField) in textField.placeholder = placeholderStr textField.addTarget(self, action: #selector(self.textChanged(_:)), forControlEvents: .EditingChanged) }) let cancel = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: { (_) -> Void in }) let action = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: { (_) -> Void in let textfield = alert.textFields!.first! //Do what you want with the textfield! }) alert.addAction(cancel) alert.addAction(action) self.actionToEnable = action action.enabled = false self.presentViewController(alert, animated: true, completion: nil) } func textChanged(sender:UITextField) { self.actionToEnable?.enabled = (sender.text! == "Validation") } 

Swift 3.0更新的解决scheme由@spoek提供

 func showAlert() { let titleStr = "title" let messageStr = "message" let alert = UIAlertController(title: titleStr, message: messageStr, preferredStyle: UIAlertControllerStyle.alert) let placeholderStr = "placeholder" alert.addTextField(configurationHandler: {(textField: UITextField) in textField.placeholder = placeholderStr textField.addTarget(self, action: #selector(self.textChanged(_:)), for: .editingChanged) }) let cancel = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: { (_) -> Void in }) let action = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: { (_) -> Void in let textfield = alert.textFields!.first! //Do what you want with the textfield! }) alert.addAction(cancel) alert.addAction(action) self.actionToEnable = action action.isEnabled = false self.present(alert, animated: true, completion: nil) } func textChanged(_ sender:UITextField) { self.actionToEnable?.isEnabled = (sender.text! == "Validation") } 

我实现了一个UIAlertController的子类,用于方便地添加文本字段以及相关的启用和禁用button。 基本逻辑与Sourabh Sharma类似,但是这个子类中的所有内容都被整理在一起。 如果你的项目涉及到很多这样的警报function,这应该是有帮助的。

 public class TextEnabledAlertController: UIAlertController { private var textFieldActions = [UITextField: ((UITextField)->Void)]() func addTextField(configurationHandler: ((UITextField) -> Void)? = nil, textChangeAction:((UITextField)->Void)?) { super.addTextField(configurationHandler: { (textField) in configurationHandler?(textField) if let textChangeAction = textChangeAction { self.textFieldActions[textField] = textChangeAction textField.addTarget(self, action: #selector(self.textFieldChanged), for: .editingChanged) } }) } @objc private func textFieldChanged(sender: UITextField) { if let textChangeAction = textFieldActions[sender] { textChangeAction(sender) } } } 

要使用它,只需在添加文本字段时提供一个textChangeAction块:

  alert.addTextField(configurationHandler: { (textField) in textField.placeholder = "Your name" textField.autocapitalizationType = .words }) { (textField) in saveAction.isEnabled = (textField.text?.characters.count ?? 0) > 0 } 

有关完整的示例,请参阅git页面 。