Swift 4 - Пользовательские оповещения с протоколами - PullRequest
0 голосов
/ 24 сентября 2018

У меня проблемы с пользовательскими оповещениями и отправкой действий обратно в VC, из которого было вызвано оповещение.

У меня есть два класса:

  • Factory
  • ConfirmationAllert

Путь пользователя, которого я пытаюсь достичь:

Пользователь выполняет действия в классе Factory после завершенияЯ звоню ConfirmationAllert, используя такой код:

func showAlert() {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let myAlert = storyboard.instantiateViewController(withIdentifier: "ConfirmationAllert")
    myAlert.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
    myAlert.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
    (view as? UIViewController)?.present(myAlert, animated: true, completion: nil)
}

В ConfirmationAllert классе у меня есть кнопка, которая:

  • отклоняет предупреждение
  • отправляет действие Фабрика - это действие должно отменить Фабрика ВК и вернуться к предыдущему ВК.

Первое действие успешно завершено, второе действие не работает.Я использую протоколы для отправки второго действия на Factory VC, но что-то не работает, и я не знаю, что.

Вот мой код:

Фабрика

final class FactoryViewController: UIViewController {
    let alert = ConfirmationAllert()

    @IBAction func didPressSave(_ sender: UIButton) {
        showAlert() 
    }

    func goToPreviousVc() {
        alert.delegate = self
        print("Inside factory") -> print don't get called
        // navigationController?.popViewController(animated: true) -> none of this works
        // dismiss(animated: true, completion: nil) -> none of this works
    }
}

extension FactoryViewController: ConfirmationAllertDelegate {
    func dismissVC() {
        goToPreviousVc()
        print("Go to previous")
    }
}

ConfirmationAllert

protocol ConfirmationAllertDelegate {
    func dismissVC()
}

class ConfirmationAllert: UIViewController {
    var delegate: ConfirmationAllertDelegate?

    @IBAction func didPressOk(_ sender: UIButton) { 
        self.delegate?.dismissVC() 
    }
}

Я не включил viewDidLoad методы, поскольку я ничего там не вызываю.

Моя проблема в том, что метод goToPreviousVc() не выполняет никаких действий.

Заранее благодарю за помощь!

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Попробуйте использовать код ниже

func showAlert() {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let myAlert = storyboard.instantiateViewController(withIdentifier: "ConfirmationAllert") as! ConfirmationAllert
    myAlert.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
    myAlert.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
    myAlert.delegate = self
    present(myAlert, animated: true, completion: nil)
}
0 голосов
/ 24 сентября 2018

Полагаю, ваша проблема в том, что вы настроили ConfirmationAllertDelegate на goToPreviousVc, который должен вызываться с использованием этого делегата.

Вместо этого попробуйте настроить ваш делегат при создании myAlert объекта

let myAlert = storyboard.instantiateViewController(withIdentifier: "ConfirmationAllert")
(myAlert as? ConfirmationAllert).delegate = self
// the rest of your code

После этого ваше оповещение будет иметь делегата с момента его создания, а когда вы нажимаете кнопку, оно должно работать так, как вы ожидаете.

...