Как отклонить и представить пользовательское всплывающее окно (UIViewController) с использованием протоколов - SWIFT - PullRequest
0 голосов
/ 30 августа 2018

У меня есть одно приложение просмотра. Я нажимаю кнопку, и появляется пользовательское всплывающее окно (UIViewController) (Презентация: в текущем контексте). У меня также есть второе настраиваемое всплывающее окно (UIViewController), которое появляется (Презентация: поверх текущего контекста), если я нажимаю кнопку в первом всплывающем окне, которое закрывается и сразу же вызывает второе всплывающее окно. Моя проблема заключается в следующем: я не могу закрыть второе всплывающее окно и немедленно представить первое всплывающее окно с помощью кнопки во втором всплывающем окне. Я использую протокол / делегаты, чтобы появилось первое всплывающее окно, но не смог закрыть второе всплывающее окно и вернуть первое всплывающее окно. Я прокомментировал, где в какой строке я получаю ошибку.

class HomePage: UIViewController, popUpDismissedDelegate, CreateHashTagDelegate{

    @IBAction func showFirtPopUp(_ sender: Any) {
        let firstPopUpVC = storyboard?.instantiateViewController(withIdentifier: 
        "firstPopUp") as! FirstPopUp
         firstPopUpVC.delegate = self
         present(firstPopUpVC, animated: true, completion: nil)
    }


    // CUSTOM PROTOCOL DELEGATE FUNCTION
    func popUpDimissed() {

    // PRESENT SECOND POPUP
    let secondPopUpVC = storyboard?.instantiateViewController(withIdentifier: "secondPopUp") as! SecondPopUp
    present(secondPopUpVC, animated: true, completion: nil)
    }

    // PRESENT FIRST POPUP
    func popUpCreateHTagDismissed() {
        let firstPopUpVC = storyboard?.instantiateViewController(withIdentifier: "firstPopUp") as! FirstPopUp
    present(firstPopUpVC, animated: true, completion: nil)

    }



    override func viewDidLoad() {
    super.viewDidLoad()

        let secondPopUpVC = storyboard?.instantiateViewController(withIdentifier: "createTag") as! SecondPopUp
        secondPopUpVC.createHTagDelegate = self
    }

}


protocol popUpDismissedDelegate {
    func popUpDimissed()

class FirstPopUp: UIViewController{

    var delegate: popUpDismissedDelegate!

    // DISMISS FIRST POPUP AND PRESENT SECOND POPUP ON TOP OF THE HOMEPAGE
    @IBAction func showFirtPopUp(_ sender: Any) {
        self.dismiss(animated: true) {
            self.delegate.popUpDimissed() // ** 2nd iteration
    }

}



protocol CreateHashTagDelegate {
    func popUpCreateHTagDismissed()
}

class SecondPopUp: UIViewController{

    var createHTagDelegate: CreateHashTagDelegate!

    // DISMISS SECOND POPUP AND PRESENT FIRST POPUP
    @IBAction func showFirstPopUp(_ sender: Any) {

        self.dismiss(animated: true, completion: {

        self.createHTagDelegate.popUpCreateHTagDismissed() // I GET THE ERROR HERE 'Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value'
        })
    }
}

1 Ответ

0 голосов
/ 30 августа 2018

Вы должны установить делегата здесь

func popUpDimissed() {
   let secondPopUpVC = storyboard?.instantiateViewController(withIdentifier: "secondPopUp") as! SecondPopUp
   secondPopUpVC.createHTagDelegate = self
   present(secondPopUpVC, animated: true, completion: nil)
}

Кстати, этот код внутри viewDidLoad

let secondPopUpVC = storyboard?.instantiateViewController(withIdentifier: "createTag") as! SecondPopUp
secondPopUpVC.createHTagDelegate = self

бесполезно

Edit:

Вы должны сделать то же самое внутри

func popUpCreateHTagDismissed() {
    let firstPopUpVC = storyboard?.instantiateViewController(withIdentifier: "firstPopUp") as! FirstPopUp
    firstPopUpVC.popUpDismissedDelegate = self 
    present(firstPopUpVC, animated: true, completion: nil)
}
...