#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. вот и все ! Большое вам спасибо 🙂