Рассмотрим
@IBAction func buttonSupport(_ sender: UIButton) {
let menuView = MenuViewController() // (1)
menuView.dismiss(animated: true, completion: nil) // (2)
openSupport() // (3)
print("Tap on Support")
}
Это:
- Создает новый
MenuViewController
, но никогда не представляет его; - Вызывает
dismiss
на контроллере представления, который никогда не былпредставлены;и - Вызывает
openSupport
из этого экземпляра MenuViewController
(который никогда не отклонялся).
В итоге вы хотите, чтобы контроллер основного вида, который представил меню, выполнялПредъявление.Итак, контроллер представления меню должен:
Определить протокол для него, чтобы информировать контроллер представления о переходе к следующей сцене:
protocol MenuViewControllerDelegate: class {
func menu(_ menu: MenuViewController, present viewController: UIViewController)
}
И затем контроллер представления меню может, когда он завершит отклонение, сказать своему делегату, что он должен представить:
class MenuViewController: UIViewController {
weak var delegate: MenuViewControllerDelegate?
@IBAction func didTapSupport(_ sender: Any) {
dismiss(animated: true) {
guard let controller = self.storyboard?.instantiateViewController(withIdentifier: "support") else { return }
self.delegate?.menu(self, present: controller)
}
}
@IBAction func didTapCancel(_ sender: Any) {
dismiss(animated: true)
}
}
Тогда контроллеру основного представления необходимо
Обязательно установите delegate
контроллера вида меню:
class ViewController: UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? MenuViewController {
destination.delegate = self
}
}
}
и
Обязательно представьте видКонтроллер, о котором его попросил контроллер меню:
extension ViewController: MenuViewControllerDelegate {
func menu(_ menu: MenuViewController, present viewController: UIViewController) {
present(viewController, animated: true)
}
}
Существует множество способов достижения этого, поэтому не забывайте о деталях.Но идея состоит в том, чтобы иметь какую-то систему, с помощью которой контроллер представления меню может запросить у кого бы то ни было представить представление support
, чтобы сделать это, а не пытаться сделать это самостоятельно.