如何在Swift中将TextField添加到UIAlertView

问题描述 投票:39回答:10

我有这个代码,但我不知道如何在UIAlertView中显示文本字段。

var altMessage = UIAlertController(title: "Warning", message: "This is Alert Message", preferredStyle: UIAlertControllerStyle.Alert)
altMessage.addAction(UIAlertAction(title: "Done", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(altMessage, animated: true, completion: nil)

我有这个代码用于文本字段,如何在UIAlertView中显示它

var my:UITextField = UITextField(frame: CGRectMake(0, 0, 10, 10))

我也试过这段代码:

var alert = UIAlertView()
alert.title = "Enter Input"
alert.addButtonWithTitle("Done")
alert.alertViewStyle = UIAlertViewStyle.PlainTextInput
alert.addButtonWithTitle("Cancel")
alert.show()

当我指定AlertStyle plainText时,它会显示一个带有默认占位符的TextField,“Login”..我想改变它,我想显示一个Decimal Pad键盘。我还想处理用户输入textField的值。有人可以帮我弄这个吗?

ios uialertview swift
10个回答
35
投票

您可以使用以下方式访问文本字段:

let textField = alert.textFieldAtIndex(0)

然后更改占位符文本:

textField.placeholder = "Foo!"

和键盘类型:

textField.keyboardType = ...

0
投票

斯威夫特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)
}

用法:

alertWithTextField(title: "bork", message: "borkborkbork", placeholder: "bork?") { result in
    print(result)
}

21
投票

试试这个代码(快速):

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

你能看到我的答案here


15
投票

在目标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];

在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"
 }

在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"
}

13
投票
            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)

11
投票

在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"
        }
    }

7
投票

斯威夫特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)
}

3
投票

针对swift 3进行了更新:

用于以下简单代码:

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

//享受编码......!


1
投票

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

用法:

    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)

稍微超载,但你可以总是使一些参数可选或/和默认


0
投票

我看到你已经在使用新的UIAlertController了 - 好主意,因为如果你使用Swift,那么旧的API几乎没用。但alert.textFieldAtIndex:不适用于此;这只适用于UIAlertView

幸运的是,UIAlertController has a method for adding text fields

© www.soinside.com 2019 - 2024. All rights reserved.