How to add textField in UIAlertController?

前端 未结 3 1952
梦谈多话
梦谈多话 2020-12-04 18:59

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

相关标签:
3条回答
  • 2020-12-04 19:45

    You can add multiple textfields to alert controller and access them with the alert controller's textFields property

    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];
        }
    }];
    
    0 讨论(0)
  • 2020-12-04 19:54

    You will get all added textfields from alert controller by its textFields readonly property, you can use it to get its text. Like

    Swift 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

    Objective-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.

    0 讨论(0)
  • 2020-12-04 19:56

    Here is an updated answer for Swift 4.0 that creates the desired kind of textfield:

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

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