简体   繁体   English

如何在 UIAlertController 中添加 textField?

[英]How to add textField in UIAlertController?

I want to realize a function about changing password.我想实现一个修改密码的功能。 It requires users to input their previous password in an alert dialog.它要求用户在警告对话框中输入他们以前的密码。

I want to click the button "Confirm the modification" then jump to the other view controller for changing password.我想单击“确认修改”按钮,然后跳转到另一个视图控制器以更改密码。 I have written some code, but I don't know how to write in the next moment.我已经写了一些代码,但我不知道下一刻怎么写。

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Change password" message:@"Please input your previous password" preferredStyle:UIAlertControllerStyleAlert];

[alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
    textField.placeholder = @"please input your previous password";
    textField.secureTextEntry = YES;
}];

UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleCancel handlers:nil];

UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"Confirm the modification" style:UIAlertActionStyleDestructive handler:*(UIAlertAction *alertAction) {
    if (condition) {
        statements
    }
}];

[alertController addAction:cancelAction];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];

在此处输入图像描述

You will get all added textfields from alert controller by its textFields readonly property, you can use it to get its text.您将通过其textFields只读属性从警报控制器获取所有添加的文本字段,您可以使用它来获取其文本。 Like

Swift 4:斯威夫特 4:

let alertController = UIAlertController(title: "", message: "", preferredStyle: .alert)
alertController.addTextField { textField in
    textField.placeholder = "Password"
    textField.isSecureTextEntry = true
}
let confirmAction = UIAlertAction(title: "OK", style: .default) { [weak alertController] _ in
    guard let alertController = alertController, let textField = alertController.textFields?.first else { return }
    print("Current password \(String(describing: textField.text))")
    //compare the current password and do action here
}
alertController.addAction(confirmAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
alertController.addAction(cancelAction)
present(alertController, animated: true, completion: nil)

Note: textField.text is optional, unwrap it before using注意: textField.text 是可选的,使用前先解包

Objective-C:目标-C:

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle:UIAlertControllerStyleAlert];
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    textField.placeholder = @"Current password";
    textField.secureTextEntry = YES;
}];
UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    NSLog(@"Current password %@", [[alertController textFields][0] text]);
    //compare the current password and do action here

}];
[alertController addAction:confirmAction];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
    NSLog(@"Canelled");
}];
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];

By [[alertController textFields][0] text] this line, it will take first textfield added to the alerController and get its text.通过[[alertController textFields][0] text]这一行,它将第一个文本字段添加到 alerController 并获取其文本。

You can add multiple textfields to alert controller and access them with the alert controller's textFields property您可以将多个文本字段添加到警报控制器并使用警报控制器的textFields属性访问它们

If the new password is an empty string, present the alert again.如果新密码为空字符串,则再次显示警报。 Or another way would be to disable the "Confirm" button, enabling it only when text field has text.或者另一种方法是禁用“确认”按钮,仅当文本字段有文本时才启用它。

UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"confirm the modification" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
    UITextField *password = alertController.textFields.firstObject;
    if (![password.text isEqualToString:@""]) {

        //change password

    }
    else{
        [self presentViewController:alertController animated:YES completion:nil];
    }
}];

Here is an updated answer for Swift 4.0 that creates the desired kind of textfield:这是创建所需类型的文本字段的 Swift 4.0 的更新答案:

// Create a standard UIAlertController
let alertController = UIAlertController(title: "Password Entry", message: "", preferredStyle: .alert)

// Add a textField to your controller, with a placeholder value & secure entry enabled
alertController.addTextField { textField in
    textField.placeholder = "Enter password"
    textField.isSecureTextEntry = true
    textField.textAlignment = .center
}

// A cancel action
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { _ in
    print("Canelled")
}

// This action handles your confirmation action
let confirmAction = UIAlertAction(title: "OK", style: .default) { _ in
    print("Current password value: \(alertController.textFields?.first?.text ?? "None")")
}

// Add the actions, the order here does not matter
alertController.addAction(cancelAction)
alertController.addAction(confirmAction)

// Present to user
present(alertController, animated: true, completion: nil)

And how it looks when first presented:以及首次展示时的外观: 在此处输入图像描述

And while accepting text:在接受文本时:

在此处输入图像描述

Swift 5.1斯威夫特 5.1

在此处输入图像描述

@objc func promptAddDialog() {
    let ac = UIAlertController.init(title: "Enter answer", message: nil, preferredStyle: .alert)
    ac.addTextField{ textField in
        textField.placeholder = "Answer"
        textField.textAlignment = .center
    }
    
    let submitAction = UIAlertAction(title: "Submit", style: .default) {
    [weak self, weak ac] _ in
    guard let answer = ac?.textFields?[0].text else { return }
    self?.submit(answer)
    }
    ac.addAction(submitAction)
    present(ac, animated: true)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM