2016-11-14 5 views
1

У меня есть панель управления панелью (с нижним меню), а также верхнее меню. Проблема в том, что я не хочу связывать желтые и зеленые представления с панелью вкладок (потому что пользователь собирается менять представления, используя верхнее меню, а не нижнее меню).Показать контроллер просмотра, который уже находится в навигационном стеке

У меня проблема, что каждый раз, когда я нажимаю кнопки, новый экземпляр представления собирается стекаться (так что я получаю что-то вроде V1 -> V2 -> V3 -> V2 -> V4 и так на)

Моего частичным решения, чтобы сделать что-то вроде этого:

@IBAction func yellowViewButtonAction(_ sender: AnyObject) 
{ 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let controller = storyboard.instantiateViewController(withIdentifier: "YelloViewController") as! YelloViewController 

    if let viewControllers = navigationController?.viewControllers { 
     for viewController in viewControllers { 
      // some process 
      if viewController is YelloViewController { 
       print("View is on stack") 
      } 
     } 

     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     let controller = storyboard.instantiateViewController(withIdentifier: "YelloViewController") as! YelloViewController 
     self.navigationController?.pushViewController(controller, animated: false) 
    } 
} 

Я могу видеть, что мнение о навигации стеке, поскольку if оператор внутри for является true. Вопрос в том, как я могу получить его вместо того, чтобы нажимать новый экземпляр одного и того же представления? (Потому что помимо огромной проблемы с памятью, что это настоящее, я также теряю любые данные, которые я имел в представлении).

Я хочу сохранить все на стеке неповрежденным.

Пример:

V1 -> V2 -> V3 -> В4 (текущий вид)

Если я вернусь к V1 от V4 я все еще хочу иметь V4, V3 и V2 на навигационном контроллере стек.

Другой вопрос: если это решение - это то, что Apple может отказать.

Я ценю любую помощь.

enter image description here

ответ

1

выглядит, как вы не используете и нужно навигационный контроллер. Всякий раз, когда вы вызываете self.navigationController?.pushViewController(controller, animated: false), новый экземпляр этого контроллера находится на пути к стеку.

В идеале вы должны вызвать popViewController из этого контроллера, где вы прошли навигацию. При создании пользовательского поведения контроллера панели вкладок довольно сложно получить логику навигации точно так, как вы планировали, по крайней мере, на мой взгляд.

В таких случаях я обычно забочусь о том, чтобы показывать и скрывать контроллеры представлений вручную.

@IBAction func didPressTab(sender: UIButton) { 
     let previousIndex = selectedIndex 
     selectedIndex = sender.tag 
     buttons[previousIndex].selected = false 
     let previousVC = viewControllers[previousIndex] 
     previousVC.willMoveToParentViewController(nil) 
     previousVC.view.removeFromSuperview() 
     previousVC.removeFromParentViewController() 
     sender.selected = true 
     let vc = viewControllers[selectedIndex] 
     addChildViewController(vc) 
     vc.view.frame = contentView.bounds 
     contentView.addSubview(vc.view) 
     vc.didMoveToParentViewController(self) 

    } 

где каждая «кнопка навигации» имеет уникальный идентификатор и вызывает функцию didPressTab.

я на самом деле узнал об этом из этого учебника: https://github.com/codepath/ios_guides/wiki/Creating-a-Custom-Tab-Bar

+0

я нужен Навигационный контроллер, потому что тогда, когда я нажать на желтый и зеленый взгляды я все еще можно увидеть в меню нижней панели. Как я сказал, я хочу, чтобы взгляды оставались нетронутыми, если я поплю, я потеряю все данные в представлении. – Adrian

+0

Вам не нужен навигационный контроллер, чтобы видеть нижние панели меню. Посмотрите на учебник по ссылке, и вы увидите :) Также код, который я предоставил, только перемещает представления, поэтому «внутреннее» состояние этих контроллеров просмотров остается неизменным. – repoguy

+0

Что я пытаюсь сказать, так это то, что я не хочу настраивать нижние панели меню, потому что у меня уже есть один. Я хочу иметь возможность изменять виды betweens, которые находятся в стеке контроллера навигации. – Adrian