Swift навигационный контроллер встроен в панель вкладок с Segue - PullRequest
0 голосов
/ 01 апреля 2019

Учитывая настройки ниже, я хотел бы иметь возможность переходить от зеленого к оранжевому. Когда я это сделаю, новый экземпляр оранжевого создается без панели вкладок. Я бы очень хотел иметь панель вкладок, если это возможно. Я подумал, что вместо использования segue я просто изменил бы выбранный индекс на контроллер nav, а затем перешел на оранжевый, используя код ниже. Но я все еще не понимаю панель вкладок.

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "orangeView") as! OrangeViewController
self.present(nextViewController, animated:true, completion:nil)

Проблема № 2 - когда оранжевый сверху, я бы хотел вернуться на один экран назад в стеке навигации (синему). Это легко, если я попал туда через навигационный контроллер - я просто выскакиваю. Но если я перешел к оранжевому с зеленого, то, кажется, нет способа добраться до синего. Я действительно думал, что изменение выбранного индекса должно работать ... но это не так.

enter image description here

Ответы [ 3 ]

0 голосов
/ 01 апреля 2019

Сначала вы должны выбрать первый индекс TabbarController, а затем вы должны нажать PurpleViewController на контроллер навигации, как показано ниже

Это решит обе ваши проблемы

  • Вы получитеПанель вкладок под PurpleViewController
  • во-вторых, если вы нажмете кнопку назад, вы получите blueViewController

    tabBarController?.selectedIndex = 0
    
    if let navC = tabBarController?.viewControllers?.first as? UINavigationController {
    
       let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
       let nextViewController = storyBoard.instantiateViewController(withIdentifier: "purpleView") as! PurpleViewController
       navC.pushViewController(nextViewController, animated: true)
    
    }
    

Надеюсь, это поможет вам.

0 голосов
/ 02 апреля 2019

Это просто интересный вопрос, в котором есть много моментов.

Чтобы упростить ситуацию, если вы хотите представить фиолетовый вид зеленым и отобразить панель вкладок, вы можете определить контекст для 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)
    }}
}

Это точный способ представить один и тот же виртуальный канал на обеих вкладках. Так что вы можете выбрать его, когда он вам действительно нужен.

0 голосов
/ 01 апреля 2019

В соответствии с оператором, который вы упомянули, и предоставленным кодом, ниже приведены возможные сценарии:

Решение 1. Вы не можете получить контроллер панели вкладок, потому что в своем коде вы представляете контроллер представления.Либо вам придется отправить экземпляр контроллера панели вкладок при его представлении, либо использовать push для просмотра контроллера.

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "purpleView") as! PurpleViewController
self.pushViewController(nextViewController, animated:true, completion:nil)

Но, чтобы перейти к оранжевому контроллеру вида с зеленого, ваш зеленый контроллер просмотра должен быть встроен в контроллер навигации.(Внедрите свой зеленый контроллер вида в контроллер навигации)

Решение 2: Поскольку вы прямо перешли на оранжевый контроллер вида из зеленого контроллера вида.Между стеками зеленого и оранжевого контроллеров в стеке нет синего контроллера, следовательно, вы не можете получить доступ к синему контроллеру вида.Вместо этого при нажатии обратно с оранжевого контроллера просмотра переключитесь на 0 индекс контроллера панели вкладок, чтобы перейти к синему контроллеру.

...