Это просто интересный вопрос, в котором есть много моментов.
Чтобы упростить ситуацию, если вы хотите представить фиолетовый вид зеленым и отобразить панель вкладок, вы можете определить контекст для vc. (Следующий код зеленого VC)
override func viewDidLoad() {
super.viewDidLoad()
self.definesPresentationContext = true
}
Что касается purpleViewController, вы предоставляете его с расширением .currentContext. Таким образом, фиолетовый покрывает только зеленый. не полный экран. (Следующий код также имеет зеленый VC)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
let purple = self.storyboard?.instantiateViewController(withIdentifier: "purpleView") as! PurpleViewController
purple?.modalPresentationStyle = .currentContext
self.present(purple!, animated: true, completion: {
})
}
}
Это первый вопрос. Второе важно, так как вы не хотите каждый раз представлять новый фиолетовый ВК. Таким образом, в навигации vc вы сначала разрываете связь между синим и фиолетовым vcs. Это гарантирует, что оранжевый произведен из зеленого.
На самом деле, это хитрость в том, что вы можете представить одинаковые vcs на обеих вкладках.
Мы можем проверить это в PurpleViewController: (следующий код имеет фиолетовый VC)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
guard (self.presentingViewController?.tabBarController?.selectedIndex)! == 1 else {return }.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
if let nv = self.presentingViewController?.tabBarController?.viewControllers?.first as? UINavigationController{
nv.pushViewController(self, animated: false)
}}
}
Это точный способ представить один и тот же виртуальный канал на обеих вкладках. Так что вы можете выбрать его, когда он вам действительно нужен.