Приложение аварийно завершает работу, потому что вы собираетесь представить тот же viewController для себя.
Причина в следующем: метод принимает приемник viewController в качестве аргумента и возвращает себя в качестве назначения.
static func toController <T: UIViewController>(_ controller:T, params: Any) -> T
Кроме того, всякий раз, когда presented(_ animated: Bool)
вызывается из Route.toController(SecondViewControlller(), params: []).presented(true)
, self
и Route.destination
одинаковы.Таким образом, это приводит к представлению того же самого viewController на себе и вызывает своего рода ошибку ниже или сбой приложения.
Попытка представить чей вид не находится в иерархии окон!
Попробуйте это:
extension UIViewController {
func presented(_ animated: Bool) {
print("\(#function)")
self.present(Route.destination, animated: animated, completion: nil)
}
func pushed(_ animated: Bool) {
print("\(#function)")
_ = self.navigationController?.pushViewController(Route.destination, animated: true)
}
}
protocol Router {
static func toController <T: UIViewController, T2: UIViewController>(_ controller: T2, from source: T, params: Any) -> T
}
class Route : Router {
static var destination: UIViewController!
static func toController <T: UIViewController, T2: UIViewController>(_ controller: T2, from source: T, params: Any) -> T {
let viewController : T2 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: String(describing: T2.self)) as! T2
destination = viewController
return source
}
}
//Your ViewController.swift
@IBAction func onButtonTap(_ sender: Any) {
Route.toController(SecondViewControlller(), from: self, params: []).presented(true)
}