Check on UIAlertController TextField for enabling the button

后端 未结 4 959
北恋
北恋 2020-12-13 09:49

I have an AlertController with a text field and two button: CANCEL and SAVE. This is the code:

@IBAction func addTherapy(sender: AnyObject)
{
    let addAler         


        
相关标签:
4条回答
  • 2020-12-13 10:01

    There is a much simpler way without using notification center, in swift:

    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")
    }
    
    0 讨论(0)
  • 2020-12-13 10:03

    I would first create the alertcontroller with the save action initially disabled. Then when adding the textfield inculde a Notification to observe its change in the handler and in that selector just toggle the save actions enabled property.

    Here is what I am saying:

    //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
    }
    

    I am doing this in another project - I got this pattern directly from apple examples. They have a very good example project outlining a few of these patterns in the UICatalog examples: https://developer.apple.com/library/content/samplecode/UICatalog/Introduction/Intro.html

    0 讨论(0)
  • 2020-12-13 10:11

    Swift 3.0 Updated Solution given By @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")
        }
    
    0 讨论(0)
  • 2020-12-13 10:17

    I implemented a subclass of UIAlertController for conveniently adding text fields and associated enabling and disabling of buttons. The basic logic is similar to that Sourabh Sharma but everything is encapsulated in this subclass for tidiness. This should be helpful if your project involves a lot of such alert functionalities.

    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)
        }
      }
    }
    

    To use it, just provide a textChangeAction block when adding the text fields:

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

    For the full example, see the git page.

    0 讨论(0)
提交回复
热议问题