Swift 4 UIAlertController, как я могу объединить различные действия в один обработчик завершения? - PullRequest
0 голосов
/ 16 ноября 2018

В следующем коде я проверяю UserDefaults. Я хочу реагировать в зависимости от стоимости. Первый вопрос: как я могу объединить оба дела в 1 завершение? И второй вопрос: могу ли я найти в обработчике завершения индекс кнопки действия вместо того, чтобы мой переключатель зависел от заголовка? Заранее спасибо.

 func checkUser() {

    let registered = UserDefaults.standard.bool(forKey: "registered")

    switch registered {

        case true:
            let firstName = UserDefaults.standard.string(forKey: "firstName") ?? ""
            let lastName = UserDefaults.standard.string(forKey: "lastName") ?? ""
            var fullName: String!
            fullName = firstName
            fullName.append(" \(lastName)")

            let optionMenu = UIAlertController(title: "Please confirm", message: "Are you \n \(String(describing: fullName))", preferredStyle: .alert)

            optionMenu.popoverPresentationController?.sourceView = self.view
            optionMenu.popoverPresentationController?.sourceRect = self.view.bounds
            let yesAction = UIAlertAction(title: "Yes", style:.destructive, handler: confirmHandler)
            let noAction = UIAlertAction(title: "no", style: .destructive, handler: confirmHandler)
            optionMenu.addAction(yesAction)
            optionMenu.addAction(noAction)
            let popover = optionMenu.popoverPresentationController
            popover?.delegate = self
            popover?.sourceView = view
            popover?.sourceRect = CGRect(x: self.view.bounds.midX - 100, y: self.view.bounds.midY + 100, width: 200, height: 200)
            DispatchQueue.main.async {
                self.present(optionMenu, animated: true, completion: {})
            }

        case false:
            let optionMenu = UIAlertController(title: "Please confirm", message: "Do you want to set up this iPad?", preferredStyle: .alert)

            optionMenu.popoverPresentationController?.sourceView = self.view
            optionMenu.popoverPresentationController?.sourceRect = self.view.bounds
            let yesAction = UIAlertAction(title: "Yes", style: .default, handler: setUpHandler)
            let noAction = UIAlertAction(title: "no", style: .default, handler: setUpHandler)
            optionMenu.addAction(yesAction)
            optionMenu.addAction(noAction)
            let popover = optionMenu.popoverPresentationController
           // popover?.delegate = self
            popover?.sourceView = view
            popover?.sourceRect = CGRect(x: self.view.bounds.midX - 150, y: self.view.bounds.midY, width: 0, height: 0)
            DispatchQueue.main.async {
                self.present(optionMenu, animated: true, completion: {})
            }
        }
}

func setUpHandler (alert: UIAlertAction) {

    print ("received: \(String(describing: alert.title))")
    switch alert.title {
        case "Yes":
            print("show set up")
        case "No":
            print("show set up")
        default:
            print("show set up")
    }
}

1 Ответ

0 голосов
/ 16 ноября 2018
func checkUser() {

    let registered = UserDefaults.standard.bool(forKey: "registered")

    let title = "Please Confirm"
    var message:String?
    var actions:[UIAlertAction]! = []
    var rect:CGRect!

    switch registered {

        case true:
            let firstName = UserDefaults.standard.string(forKey: "firstName") ?? ""
            let lastName = UserDefaults.standard.string(forKey: "lastName") ?? ""
            var fullName: String!
            fullName = firstName
            fullName.append(" \(lastName)")


            let yesAction = UIAlertAction(title: "Yes", style:.destructive, handler: confirmHandler)
            let noAction = UIAlertAction(title: "no", style: .destructive, handler: confirmHandler)
            actions.append(yesAction)
            actions.append(noAction)
            rect = CGRect(x: self.view.bounds.midX - 100, y: self.view.bounds.midY + 100, width: 200, height: 200)
            break

        case false:
            let yesAction = UIAlertAction(title: "Yes", style: .default, handler: setUpHandler)
            let noAction = UIAlertAction(title: "no", style: .default, handler: setUpHandler)
            actions.append(yesAction)
            actions.append(noAction)
            rect = CGRect(x: self.view.bounds.midX - 150, y: self.view.bounds.midY, width: 0, height: 0)
            break
    }

    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)

    alert.popoverPresentationController?.sourceView = self.view
    alert.popoverPresentationController?.sourceRect = self.view.bounds
    for action in actions {
        alert.addAction(action)
    }
    let popover = alert.popoverPresentationController
    popover?.delegate = self
    popover?.sourceView = view

    DispatchQueue.main.async {
        self.present(alert, animated: true, completion: nil)
    }
}

func setUpHandler (alert: UIAlertAction) {

    print ("received: \(String(describing: alert.title))")
    switch alert.title {
    case "Yes":
        print("show set up")
    case "No":
        print("show set up")
    default:
        print("show set up")
    }
}

Создайте только то, что НУЖНО внутри ящиков.Итак, установите некоторые переменные (то, что я называю настройкой работы), чтобы установить, что изменится в каждом конкретном случае.Затем, после ВСЕХ работ, выполненных после случаев, представьте предупреждение.

Что касается ваших вопросов - у вас должна быть каждая кнопка с разным обработчиком.Это 1) наиболее читаемый и 2) обеспечивает его там, где он не так связан.Позволяет для многократного использования.

...