4-уровневая навигация ViewController в приложении iOS с использованием пользовательских переходов - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь создать меню с 4 различными уровнями, где каждый уровень представляет собой UIViewController.Я хочу, чтобы меню и каждый из его уровней были представлены модально.В настоящее время я делаю это, позволяя базовому ViewController (VC) представить еще один, который, в свою очередь, представляет 3-й, который представляет 4-й (структура будет ABCD, где каждый - представляет вызов UIViewController.present(_:animated:completion:) для соответствующего уровня).

Затем я реализую UIViewControllerTransitioningDelegate и снабжаю его настраиваемым объектом перехода.Это хорошо работает для первых 3-х уровней (т.е. меню работает, как и ожидалось для уровня ABC), но когда я нахожусь на 4-м уровне и пытаюсь отклонить его (т. Е. Переходя от ABCD к ABC), уровень B краткоотображается вместо уровня C. во время воспроизведения анимации.После завершения анимации уровень C снова всплывает над B.

Я подозреваю, что проблема заключается в том, чтобы как-то представить более 3 виртуальных каналов в иерархии, но этого не происходит, если вместо этого используется анимация отклонения по умолчаниюиз пользовательского, который я использую.

Может быть, я должен пойти на другой подход к навигации, или есть какой-то способ обойти это поведение?Мне нужно, чтобы меню было «модальным», что, насколько я могу судить, помешало бы мне использовать UINavigationController (мне не нужны навигационные панели).

Помощь очень важна.

--- EDIT ---

Вот пример «псевдокода» того, чего я пытаюсь достичь, так как проект довольно большой, и у меня будут проблемы с его вставкой:

 class A: UIViewController: UIViewControllerTransitioningDelegate {
   func viewDidLoad(){...}
    .
    .
    .
   @objc func presentB(){
     self.present(B, animated: true, completion: nil)
   }

   func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return CustomTransition(presenting: true)
   }
   func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return CustomTransition(presenting: false)
   }

 }


class B: UIViewController: UIViewControllerTransitioningDelegate {
   func viewDidLoad(){...}
    .
    .
    .
   @objc func dismiss(){
     self.dismiss(animated: true, completion: nil)
   }

   @objc func presentC(){
     self.present(C, animated: true, completion: nil)
   }

   func animationController(forPresented:presenting:source:) -> UIViewControllerAnimatedTransitioning? { ... }

   func animationController(forDismissed:) -> UIViewControllerAnimatedTransitioning? {...}

}


class C: UIViewController: UIViewControllerTransitioningDelegate {
   func viewDidLoad(){...}
    .
    .
    .
   @objc func dismiss(){
     self.dismiss(animated: true, completion: nil)
   }

   @objc func presentD(){
     self.present(D, animated: true, completion: nil)
   }

   func animationController(forPresented:presenting:source:) -> UIViewControllerAnimatedTransitioning? { ... }

   func animationController(forDismissed:) -> UIViewControllerAnimatedTransitioning? {...}

}

class D: UIViewController {
   func viewDidLoad(){...}
    .
    .
    .
   @objc func dismiss(){
     self.dismiss(animated: true, completion: nil)
   }   
}

...