сделайте что-нибудь после появления первого контроллера представления

#swift

#swift

Вопрос:

У меня есть контроллер представления с кнопкой.. Эта кнопка вызывает «Present as Popover Seague» для второго контроллера представления.

Второй контроллер представления имеет кнопку закрытия с этой функцией:

 @IBAction func exit(_ sender: UIButton) {
   self.dismiss(animated: true, completion: nil)
}
  

Теперь я хотел бы что-то сделать в первом контроллере после того, как второй контроллер будет уволен.

В первом контроллере представления я попробовал эти функции:

 override func viewDidAppear(_ animated: Bool) {
   print("viewDidAppear")
}
    
override func viewWillAppear(_ animated: Bool) {
   print("viewWillAppear")
}
  

но журнал консоли не будет показан.
В чем моя ошибка?

FirstViewController

 import UIKit


class firstVC: UIViewController {
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        //ERROR
        secondVC.dismissCompletion = {
            print("dismissCompletion")
        }
    }
    
}
  

SecondVC (всплывающее окно)

 import UIKit

class secondVC: UIViewController {


    var dismissCompletion: (() -> Void)?

    // EXIT POPOVER
    @IBAction func exit(_ sender: UIButton) {
        
        self.dismiss(animated: true, completion: dismissCompletion)
        
    }
  
}
  

Комментарии:

1. вы пробовали делегировать?

Ответ №1:

viewDidAppear() Метод основного контроллера представления не будет вызван из-за используемого вами стиля представления всплывающего окна. Если вы решите представить второй контроллер просмотра на весь экран — эти методы будут запущены.

Если мы придерживаемся всплывающего окна, первое, что вам нужно сделать, это в вашем втором контроллере представления, который представлен, добавить свойство для закрытия, которое будет выполнено при его закрытии:

 class PopoverViewController: UIViewContoller {
    var dismissCompletion: (() -> Void)?

    @IBAction func exit(_ sender: UIButton) {
        self.dismiss(animated: true, completion: dismissCompletion)
    }
}
  

И в вашем главном контроллере представления вы определяете, что нужно сделать при отклонении всплывающего окна:

 popoverViewContoller.dismissCompletion = {
    // do stuff
}
  

Обновить:

Я предполагаю, что вы настроили переход в своей раскадровке. Я также предполагаю, что в вашей раскадровке вы присвоили контроллерам представления соответствующие имена классов:

введите описание изображения здесь

Вот как должен выглядеть ваш код:

 class FirstViewController: UIViewController {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let secondVC = segue.destination as? SecondViewController else {
            return
        }
        
        secondVC.dismissCompletion = {
            print("Popover dismissed")
        }
    }
}

class SecondViewController: UIViewController {
    var dismissCompletion: (() -> Void)?
    
    @IBAction func exit(_ sender: Any) {
        dismiss(animated: true, completion: dismissCompletion)
    }
}
  

Пожалуйста, обратите внимание на имена классов и то, как я получил secondVC экземпляр.

Комментарии:

1. ссылка popoverViewContoller.dismissCompletion = {} выдает ошибку: элемент экземпляра ‘dismissCompletion’ не может быть использован для типа ‘popoverViewContoller’; вы имели в виду использовать значение этого типа вместо этого?

2. @Ghost108 вы должны объявить свойство в классе, который представляет ваш контроллер всплывающего представления (тот, где находится ваш exit IBAction), затем установить завершение для экземпляра этого класса. Имя в моем ответе является случайным, я просто показал вам структуру. Если вы все сделаете правильно, ошибки быть не должно.

3. Я вставил var dismissCompletion: (() -> Void)? @IBAction func exit(_ sender: UIButton) { self.dismiss(animated: true, completion: dismissCompletion) } в свой SecondViewController и в viewdidload моего firstviewcontroller: secondVC.dismissCompletion = { // do stuff } Ошибка: Instance member 'dismissCompletion' cannot be used on type 'secondVC'; did you mean to use a value of this type instead?

4. @Ghost108 Вы уверены, что ваш secondVC имеет тип SecondViewController? Не могли бы вы опубликовать свой код где-нибудь, чтобы увидеть полную картину?

5. вот и все ! Большое вам спасибо 🙂