How to add a TextField to UIAlertView in Swift

偶尔善良 提交于 2019-11-29 20:53:36
David Berry

You can access the textfield with:

let textField = alert.textFieldAtIndex(0)

Then to change the placeholder text:

textField.placeholder = "Foo!"

And the keyboard type:

textField.keyboardType = ...
Guy Kahlon

Try This Code (with swift):

func configurationTextField(textField: UITextField!)
    {
        println("configurat hire the TextField")

        if let tField = textField {

            self.textField = textField!        //Save reference to the UITextField
            self.textField.text = "Hello world"
        }
    }


 func handleCancel(alertView: UIAlertAction!)
        {
           println("User click Cancel button") 
           println(self.textField.text)
        }

 var alert = UIAlertController(title: "Alert Title", message: "Alert Message", preferredStyle: UIAlertControllerStyle.Alert)

    alert.addTextFieldWithConfigurationHandler(configurationTextField)

    alert.addAction(UIAlertAction(title: "Close", style: UIAlertActionStyle.Cancel, handler:handleCancel))
    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler:{ (UIAlertAction)in
            println("User click Ok button")
            println(self.textField.text)
        }))
    self.presentViewController(alert, animated: true, completion: {
            println("completion block")
        })

Can you see also my answer here

Darshit Shah

In Objective C

 UIAlertView *alertView =  [[UIAlertView alloc]initWithTitle:@"Duplicate file" message:@"A file with the same name already exists." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
 alertView.alertViewStyle = UIAlertViewStylePlainTextInput;

 [[alertView textFieldAtIndex:0] setText:@"Filename"];
 [[alertView textFieldAtIndex:0] setPlaceholder:@"Enter Filename"];
 [alertView show];

In Swift 2.3

func doSomething(){
    var alert = UIAlertController(title: "Duplicate file", message: "A file with the same name already exists.", preferredStyle: UIAlertControllerStyle.Alert)

    alert.addTextFieldWithConfigurationHandler(configurationTextField)

    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler:{ (UIAlertAction)in
         print("User click Ok button")
         print(self.textField.text)
    }))

 self.presentViewController(alert, animated: true, completion: {
     print("completion block")
 })
}

 func configurationTextField(textField: UITextField!){
     textField.text = "Filename"
 }

In Swift 3

func doSomething(){
    var alert = UIAlertController(title: "Duplicate file", message: "A file with the same name already exists.", preferredStyle: UIAlertControllerStyle.alert)

    alert.addTextField(configurationHandler: configurationTextField)

    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler:{ (UIAlertAction)in
        print("User click Ok button")
        print(self.textField.text)
    }))

    self.present(alert, animated: true, completion: {
        print("completion block")
    })
}

func configurationTextField(textField: UITextField!){
    textField.text = "Filename"
}
            var inputTextField: UITextField?

            //Create the AlertController
            let actionSheetController: UIAlertController = UIAlertController(title: "Rename", message: "", preferredStyle: .Alert)

            //Create and add the Cancel action
            let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
        //Do some stuff
            }
            actionSheetController.addAction(cancelAction)
            //Create and an option action
            let nextAction: UIAlertAction = UIAlertAction(title: "OK", style: .Default) { action -> Void in
        //Do some other stuff
            }
            actionSheetController.addAction(nextAction)
            //Add a text field
            actionSheetController.addTextFieldWithConfigurationHandler { textField -> Void in
        // you can use this text field
        inputTextField = textField
            }

            //Present the AlertController
            self.presentViewController(actionSheetController, animated: true, completion: nil)

In Swift 3

    let alert = UIAlertController(title: "Alert Ttitle", message: "Alert Message", preferredStyle:
        UIAlertControllerStyle.alert)

    alert.addTextField(configurationHandler: textFieldHandler)

    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler:{ (UIAlertAction)in


    }))

    self.present(alert, animated: true, completion:nil)

func textFieldHandler(textField: UITextField!)
    {
        if (textField) != nil {
            textField.text = "Filename"
        }
    }

Swift 4:

var textField: UITextField?

func configurationTextField(textField: UITextField!) {
    if (textField) != nil {
        self.textField = textField!        //Save reference to the UITextField
        self.textField?.placeholder = "Some text";
    }
}

func openAlertView() {
    let alert = UIAlertController(title: "Alert Title", message: "Alert Message", preferredStyle: UIAlertControllerStyle.alert)
    alert.addTextField(configurationHandler: configurationTextField)
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler:nil))
    alert.addAction(UIAlertAction(title: "Ok", style: .default, handler:{ (UIAlertAction) in
        print("User click Ok button")
    }))
    self.present(alert, animated: true, completion: nil)
}

Updated for swift 3 :

used below simple code:

    func showAlertWithTwoTextFields() {

        let alertController = UIAlertController(title: "Add Event", message: "Enter event and it's description", preferredStyle: .alert)

        let saveAction = UIAlertAction(title: "Save", style: .default, handler: {
            alert -> Void in

            let eventNameTextField = alertController.textFields![0] as UITextField
            let descriptionTextField = alertController.textFields![1] as UITextField

            print("firstName \(String(describing: eventNameTextField.text)), secondName \(String(describing: descriptionTextField.text))")

            if eventNameTextField.text != "" || descriptionTextField.text != ""{

            }else{
               // self.showAlertMessageToUser(title: "Alert", messageToUser: "Fields should not be empty, Please enter given info...")
// Show Alert Message to User As per you want
            }

        })

        let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: {
            (action : UIAlertAction!) -> Void in

        })

        alertController.addTextField { (textField : UITextField!) -> Void in
            textField.placeholder = "Enter event Name"
        }
        alertController.addTextField { (textField : UITextField!) -> Void in
            textField.placeholder = "Enter event description in short"
        }

        alertController.addAction(saveAction)
        alertController.addAction(cancelAction)

        self.present(alertController, animated: true, completion: nil)
    }

// Enjoy Coding...!

Swift 2.2

import UIKit

extension UIAlertController {
    // MARK: - UIAlertController+Present

    private struct ButtonsName {
        static let Ok = NSLocalizedString("uIAlertController.buttonName.ok", comment: "")
        static let Cancel = NSLocalizedString("uIAlertController.buttonName.cancel", comment: "")
    }


    class func suggestionAlertViewWithTitle(title:String?, placeholder:String, message:String, presenter:UIViewController, destructive:Bool = false,
                                            okButtonCompletion:((enteredSuggestion:String?)->Void)?, cancelButtonCompletion:(()->Void)?, presentCompletion:(()->Void)?) {
        var alertTitle = UIAlertController.appName()
        if let userTitle = title {
            alertTitle = userTitle
        }

        let controller = UIAlertController(title: alertTitle, message: message, preferredStyle: .Alert)
        let okAction = UIAlertAction(title: ButtonsName.Ok, style: destructive == true ? .Destructive : .Default) { (action) in
            if let okButtonCompletion = okButtonCompletion {
                let text = controller.textFields?.first?.text
                dispatch_async(dispatch_get_main_queue(), {
                    okButtonCompletion(enteredSuggestion: text)
                })
            }
        }
        let cancelAction = UIAlertAction(title: ButtonsName.Cancel, style: .Cancel) { (action) in
            if let cancelButtonCompletion = cancelButtonCompletion {
                dispatch_async(dispatch_get_main_queue(), {
                    cancelButtonCompletion()
                })
            }
        }

        controller.addAction(okAction)
        controller.addAction(cancelAction)
        controller.addTextFieldWithConfigurationHandler { (textField) in
            textField.placeholder = placeholder
        }

        dispatch_async(dispatch_get_main_queue(), {
            presenter.presentViewController(controller, animated: true, completion: presentCompletion)
        })
    }

    // MARK: - Private

    private static func appName () -> String {
        return NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String
    }
}

usage:

    UIAlertController.suggestionAlertViewWithTitle(nil, placeholder: placeholder, message: message,
                                                          presenter: self, destructive: false,
                                                          okButtonCompletion: { (enteredSuggestion) in
                self.logger.sendAllLogs(self.currentUser, suggestedTitle: enteredSuggestion)
        }, cancelButtonCompletion:nil, presentCompletion: nil)

a little bit overloaded, but u can always make some parameters optional or/and default

I see you're already using the new UIAlertController -- good idea, since there's little use in old API if you're usung Swift anyway. But alert.textFieldAtIndex: won't work for that; it's for UIAlertView only.

Luckily, UIAlertController has a method for adding text fields.

Swift 5

public func alertWithTextField(title: String? = nil, message: String? = nil, placeholder: String? = nil, completion: @escaping ((String) -> Void) = { _ in }) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
    alert.addTextField() { newTextField in
        newTextField.placeholder = placeholder
    }
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel) { _ in completion("") })
    alert.addAction(UIAlertAction(title: "Ok", style: .default) { action in
        if
            let textFields = alert.textFields,
            let tf = textFields.first,
            let result = tf.text
        { completion(result) } 
        else
        { completion("") }
    })
    navigationController?.present(alert, animated: true)
}

Usage:

alertWithTextField(title: "bork", message: "borkborkbork", placeholder: "bork?") { result in
    print(result)
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!