Как получить значение текстового поля с помощью UIAlert в другом классе? Swift - PullRequest
0 голосов
/ 28 мая 2020

Я создал файл, содержащий разные типы кодов c UIAlert, поэтому я могу использовать их повторно. Моя проблема в том, как мне получить textfield value из другого класса? Пока все ответы, которые я нашел, были закодированы в одном классе, и я этого не хочу. Спасибо.

Файл UIAlert

func alertVerify(title: String, message: String, sender: UIViewController, verifyActionCompletionHandler: ((UIAlertAction) -> Void)? = nil, resendActionCompletionHandler: ((UIAlertAction) -> Void)? = nil) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
    let verifyAction = UIAlertAction(title: "Verify", style: .default, handler: verifyActionCompletionHandler)
        alert.addAction(verifyAction)
    let resendAction = UIAlertAction(title: "Resend", style: .default, handler: resendActionCompletionHandler)
       alert.addAction(resendAction)
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        alert.addAction(cancelAction)

    alert.addTextField(configurationHandler: { textField in
        textField.placeholder = "Verification code"
    })
    DispatchQueue.main.async(execute: {
        sender.present(alert, animated: true)
    })
}

ViewController

func verifyEmail() {
        guard let email = inputTextField.text else {
            return
        }

        alertVerify(title: "Email Verification Code", message: "Enter the verification code we send in your updated email adress.", sender: self, verifyActionCompletionHandler: { UIAction in
            if let inputCode = alert.textFields?.first?.text { //error: unresolved identifier 'alert'
                print("Verification code: \(inputCode)")
                //Do something
            }
        }, resendActionCompletionHandler: { UIAction in
            self.updateData(updateItem: "email", updateData: ["email": email], endpoint: "info")
        })
    }

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете добавить в свой метод еще один параметр для передачи контроллера предупреждений:

func alertVerify(title: String, message: String, sender: UIViewController, alert: UIAlertController, verify: ((UIAlertAction) -> Void)? = nil, resend: ((UIAlertAction) -> Void)? = nil) {
    alert.title = title
    alert.message = message
    alert.addTextField { 
        $0.placeholder = "Verification code"
    }
    alert.addAction(.init(title: "Verify", style: .default, handler: verify))
    alert.addAction(.init(title: "Resend", style: .default, handler: resend))
    alert.addAction(.init(title: "Cancel", style: .cancel))
    DispatchQueue.main.async {
        sender.present(alert, animated: true)
    }
}

Затем, когда вы вызываете свой метод, вы передаете ему экземпляр своего контроллера предупреждений:

func verifyEmail() {
    let alert = UIAlertController(title: nil, message: nil, preferredStyle: .alert)
    alertVerify(title: "Email Verification Code", 
                message: "Enter the verification code we send in your updated email adress.",
                sender: self,
                alert: alert,
                verify: { _ in
        let inputCode = alert.textFields![0].text!
        print("Verification code: \(inputCode)")
    }, resend: nil)
}

Другой вариант - создать подкласс UIAlertController и добавить к нему свой собственный метод:

AlertController.swift

import UIKit
class AlertController: UIAlertController {
    var controller: UIViewController!
    convenience init(title: String?, message: String?, sender: UIViewController) {
        self.init(title: title, message: message, preferredStyle: .alert)
        controller = sender
    }
    func verify(_ action: ((UIAlertAction) -> Void)? = nil, resend: ((UIAlertAction) -> Void)? = nil) {
        if actions.isEmpty {
            addTextField {
                $0.placeholder = "Verification code"
            }
            addAction(.init(title: "Verify", style: .default, handler: action))
            addAction(.init(title: "Resend", style: .default, handler: resend))
            addAction(.init(title: "Cancel", style: .cancel))
        }
        DispatchQueue.main.async {
            self.controller.present(self, animated: true)
        }
    }
}

Затем вы создаете экземпляр своего настраиваемого контроллера оповещений и вызываете свой метод от него:

func verifyEmail() {
    let alert = AlertController(title: "Email Verification Code", message: "Enter the verification code we send in your updated email adress.", sender: self)
    alert.verify({ _ in
        let inputCode = alert.textFields![0].text!
        print("Verification code: \(inputCode)")
    }, resend: nil)
}
...