2016-07-07 6 views
3

ストーリーボードに複数のViewControllerが追加されたアプリで、階層を変更する必要があります。UIViewControllerを削除する正しい方法

は、私はこれらの二つの流れ考えてみましょう:

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

  2. A ---> Bを - - > C ---> B私は、これは動作するはずと信じているシナリオ1では

(私は2番目のBは、新しいインスタンスになりたい):

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を削除して新しいインスタンスを作成するにはどうしたらいいですか?ナビゲーションスタックからBコントローラを削除する

答えて

0

が、私は好奇心が強い、あなただけの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を削除します。その場合、新しいインスタンスを取得するためにBへのセグを実行する必要があります。あなたはそれからA→C→Bを持ちます。

これは多分最適化されているかもしれません。さらに、ViewControllerBが常に2位(または見方によっては1位)にあることがわかっている場合は、単にインデックスでそれを削除できます。私があなたに与えたコードは、それがどこにあるか、そこに何個のBsがあるにせよ、常にBを取り除くでしょう。

0

:あなたはメモリ内の最初のBを維持するために欠けている場合

//some code to remove it  
NSMutableArray *viewControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
[viewControllers removeObjectAtIndex:i]; 
self.navigationController.viewControllers = viewControllers; 
関連する問題