Каждый контроллер представления имеет либо parent
, либо presentingViewController
(или оба), поэтому, запросив их, вы можете выяснить, «где вы находитесь».
Обычно этого достаточно, чтобы рассказать вам о ситуации, особенно если вы разумно используете типы классов (например, вы можете сделать свои контроллеры навигации разными подклассами UINavigationController только для того, чтобы знать, где вы находитесь позже).
Если вы хотите получить полный обзор цепочку контроллеров представления туда, где вы находитесь, вы можете проследить свой путь вверх по цепочке рекурсивно, например:
func trace(_ vc: UIViewController) {
print(vc)
if let parent = vc.parent {
print("parent:")
trace(parent)
return
}
if let presenter = vc.presentingViewController {
print("presenter:")
trace(presenter)
return
}
print("done")
}
Этот пример печатает, а не накапливает список контроллеров представления вместе с характером соединения между каждым из них (что вам действительно нужно), но, вызвав его из «последнего» контроллера представления в цепочке, вы можете получить мысленное представление о том, как цепочка должна выглядеть в той точке, где вы хотите сказать: « go не глубже ".
Вот более полный пример, который показывает, как накапливать ab обратная трассировка в массив:
class MyVC: UIViewController {
func makeTrace() {
super.viewDidAppear(animated)
let result = self.trace([(.start, self)])
print(result)
}
enum Link: String {
case parent
case presenter
case start
}
typealias Chain = [(Link, UIViewController)]
func trace(_ chain: Chain) -> Chain {
if let parent = chain.last!.1.parent {
return trace(chain + [(.parent, parent)])
}
if let presenter = chain.last!.1.presentingViewController {
return trace(chain + [(.presenter, presenter)])
}
return chain
}
}
Итак, result
скажет вам достаточно, чтобы знать, «где вы находитесь».