2016-07-07 5 views
3

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

Допустим, у меня есть эти два потока:

  1. ---> B ---> C --->

  2. ---> B - -> C ---> B (Я хочу, чтобы второй B будет новый экземпляр)

в сценарии 1 я считаю, что это должно работать:

this.NavigationController.PopToRootViewController(true); 

Но я не могу получить, как достичь Сценарий 2.

Один из вариантов я думаю о модифицирует стек, но кажется, что это не правильный подход:

for (int i = 0; i < NavigationController.ViewControllers.Length; i++) 
     { 
      if (NavigationController.ViewControllers[i] is MyNotSoAmazingVc) 
      { 
       //some code to remove it 
       break; 
      } 
     } 

Как удалить B и создать новый экземпляр?

ответ

0

Мне интересно, если вы желаете, чтобы сохранить первое B в памяти, вы можете просто нажать на новый SEGUE в B. Каждый раз, когда переход является выполняется новый экземпляр этого контроллера представления (будьте осторожны с управлением памятью).

Если вы хотите, чтобы удалить B из стека контроллера представления, а затем создать новый экземпляр B, вы можете сделать это:

var controllers = this.NavigationController.ViewControllers; 
var newcontrollers = new UIViewController[controllers.Length - 1]; 
int index = 0; 
foreach (var item in controllers) 
{ 
    if (!(item.GetType() == typeof(ViewControllerB))) 
    { 
     newcontrollers[index] = item; 
     index++; 
    } 
} 
this.NavigationController.ViewControllers = newcontrollers; 

Это удалит B из стека контроллера представления. Затем вам нужно выполнить segue для B, чтобы получить там новый экземпляр. Затем вы получите A -> C -> B.

Возможно, это может быть немного оптимизировано. Кроме того, если вы знаете, что ViewControllerB всегда будет в позиции 2 (или позиции 1 в зависимости от того, как вы на это смотрите), вы можете просто удалить его по индексу. Код, который я вам дал, всегда будет удалять B независимо от того, где он находится или сколько Bs есть.

0

удалить контроллер B из стека навигации:

//some code to remove it  
NSMutableArray *viewControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
[viewControllers removeObjectAtIndex:i]; 
self.navigationController.viewControllers = viewControllers; 
Смежные вопросы