2012-01-13 11 views
1

私のアプリでビューを管理するのが難しく、何らかの説明をお持ちいただければ幸いです。私の考えでは、プログラムは次のように階層構造になっています。サブビューを連続して追加および削除する

BNG_AppViewController:UIViewController 

-calls-

NameListSelectionController:UIViewContoller 

-calls-

GameViewController:UIViewController 

-calls-

NameResultsController:UIViewController 

インターフェースからXIBsを使用して構築されたサブビューのすべてビルダはfolと同じ方法で呼び出されますlowingは: - 通常の呼び出しをトリガーするボタンを使用して

NameListSelectionController *NameListSelectionControllerScreen = [[NameListSelectionController alloc] initWithNibName:@"NameListSelectionController" 
       bundle:nil]; 
    [self.view addSubview:NameListSelectionControllerScreen.view]; 

私は私のビュー階層を上に移動したい

、私は、コントローラクラスの中から、次のと同一の呼び出しを使用しています。

[self.view removeFromSuperview]; 

この方法を使用すると、階層的に階層を上下に移動できます。

しかし、私が階層構造をバックアップするときは、第2レベルのコントローラ(上記のNameListSelectionController)をスキップし、第3レベルから第1レベルに直接移動してください。

これまでのところ、階層から下に向かって私の3番目のレベルを呼び出すときに、2番目のレベルのビューを階層から削除しようとしましたが、無駄です。

[self.view removeFromSuperview]; 
    gameScreen = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil]; 
    [self.view addSubview:gameScreen.view]; 

しかし、私は、コードの2行目と3行目に明らかな影響を与えることなく、私の第一レベルでのバックアップ終了しているようです。私はまた、結果のない、階層の2番目のレベルをバックに送信しようとしました。

私のプログラムの構造を修正する方法の大きな絵のアイデアを含め、正しい方向へのポインタをありがとうと思います。私は上記の線形方法でユーザーを指示する必要がありますが、私はプログラムをそのように構築する必要があるかどうかわかりません。

私はサブビューとremoveFromSuperview呼び出しですべてのドキュメントを読みましたが、私が求めていたことを実行するためのメソッドを見なかったか、私が読んだことを理解できませんでした。私はNavigationControllerを使用する可能性について検討しましたが、これは私が何をしようとしていたか(あるいは私がそれらを見ることができなかったかもしれない)何らかの利点を提供していないようです。

+0

あなたの主な問題は何ですか? NameListSelectionController:UIViewContollerをスキップすると元に戻りますか? – Hiren

+0

はい。それがまさに私が直面している重要な問題です。混乱させて申し訳ありません。 – GWTiger

答えて

1

を追加するには、この

for (UIView *view in self.view.subviews) { 
     if ([view isKindOfClass:[BNG_AppViewController class]] || [view isKindOfClass:[NameListSelectionController class]] || [view isKindOfClass:[NameResultsController class]]) { 
      [view removeFromSuperview]; 
     } 
    } 

を使用することができます。
のいずれかをスキップしたい場合は、-[UINavigationController popToRootViewControllerAnimated:]または-[UINavigationController popToViewController:animated:]を使用してこれを行うことができます。

-(void)goToMainCategoryView; 
{ 
    id object = nil; 

    for (UIViewController *viewControl in self.navigationController.viewControllers) 
    { 
     if(viewControl.view.tag == 0) 
     { 
      object = viewControl; 
     } 
    } 
    [self.navigationController popToViewController:object animated:YES]; 
} 
+0

あなたはそれを済ませましたか? – Hiren

0

そこには多くの質問があり、プログラム全体を見ることなく、正確に答えるのは難しいでしょうが、何か一般的なアドバイスをしてください。

ARC(Automatic Reference Counting)を使用している場合、メモリ管理上、何も漏れていません。そうでない場合は、UIViewをalloc-initしてサブビューとして追加するたびに、そのビューで「release」を呼び出さずにリークしています。 UIViewをサブビューとして追加すると、親ビューには保持されます。したがって、呼び出し元は解放されても解放される心配はありません。

UINavigationControllerが設計されたものを正確に行い、一連のビューを階層内に表示したいようです。スタック内の任意のビューにプッシュ/ポップすることができ、すべてのビューを追跡できます。それは本当にここにあなたの最良の選択となるようです。

0

は、あなたの現在のビューが削除されていないか、またはあなたの次のビューは、このコードを使って、表示されません、この

[self.view removeFromSuperview]; 
gameScreen = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil]; 
[self.view addSubview:gameScreen.view]; 

で問題に直面していますか?はい、あなたはスーパービューからビューを削除して、あなたがナビゲーションコントローラを使用することができ、その目的のために、この

gameScreen = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:nil]; 
    [self.view addSubview:gameScreen.view]; 
関連する問題