2011-08-07 25 views
0

これはやや長めですが、わかりやすいと思います。私はこれを行う決定的な方法を見つけることができないようで、問題は微妙です(私は思っています)。UINavigationController階層のチャンクを切り替えてナビゲーションバーを保持

  • メインリスト(選択された主なリスト項目の)
    • サブリスト(カスタムテーブルセルと高さを持つ)
      • サブ:

        私は、そのGUI階層のようになりますアプリケーションを持っていますリスト情報(選択されたサブリスト項目上)

        • 詳細情報
    • (選択された主なリスト項目の)設定(選択した設定項目の)
      • 設定情報
        • さらに詳細

たら、メインリスト項目が選択されている場合、ユーザはサブリストと設定の間を入れ替えることができます。そのうちの1つに独自のGUIサブ階層があります。スイッチはツールバーを使用して行われます。

私はいくつかのアプローチを試しましたが、何も正確に正しく動作しないようです。

(ここでは他の質問に触発された)最初の試み

  • UINavigationController
    • UITableViewControllerBase(ペン先からロード)
      • TableViewController1(didSelectRowAtIndexPathにプログラム的にロードされた)
      • はTableViewController2は(から交換することができますTableViewController1)

Iは、スイッチを行うためにそれを使用して、様々なオブジェクトが作成されるようにを通じてrootViewControllerへの参照を渡します。

[rootViewController switchViews] 

でrootViewController.switchViewsは():

[TableViewController2 alloc] init]; 
[TableViewController1 removeFromSuperview]; 
[self.view insertSubview:TableViewController2.view atIndex:0] 
. . . 

基本的に、rootViewControllerは、スイッチを管理します。これはスイッチで機能しますが、メインリストに戻って階層をナビゲートすると、表のセルが正しく初期化されません。cellForRowAtIndexPathで

static NSString *CellId = @"CellId"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIDentifier:CellId]; 
if (cell == nil) 
{ 
    ... (this does not get called) 
} 

括弧内のコードが呼び出されませんので、テーブルビューは、「汎用」に見えますが、つまり、カスタムセルが使用されていません。これは無関係なエラーかもしれませんが、ここのアプローチ全体が私にとって正しいとは思えませんでした。私の理解は、アクティブビューコントローラがスイッチを処理する必要があるということです。だから違うものを試しました。 。 。 (iPhoneプログラミングの本を始まりに触発)

2回目の試行:ロードされた(didSelectRowAtIndexPathにプログラムでロードされた)(ペン先からロード)

  • UINavigationController
    • UITableViewControllerBase
      • UIViewControllerParent
        • TableViewController1(親のloadViewでプログラム的に)
        • (TableViewController1から交換することができる)
        • TableViewController2

ここでは、コントローラの親でネストされたテーブルビューの両方を囲み、そして親がすべての作業を行うせています。親のloadViewメソッドで

():

TableViewController1 *tvc1 = [[UITableViewController alloc] init]; 
self.tableViewController1 = tvc1; 
[self.view insertSubview:tableViewController1.view atIndex:0]; 
[tvc1 release]; 

問題ここではtableViewController1は、initedものの、それが挿入されています時に有効なビューを持っていないということです。したがって、loadView関数は何度も何度も呼び出されます。 。 。私は同じ問題をviewDidLoadに入れてみました。

iOSデベロッパーサイトからサンプルコードTheElementsを読み、当初はそのルートに行くつもりだった。問題は、ユーザーが自分のアプリケーションでビューを切り替えた後、さらにドリルダウンできる画面が増えたことです。私はこれらすべての画面をアプリケーションの階層の一部にしたい(私たちが望むときにメインリストに戻ることができるように)。 TheElementsはスイッチを示していますが、単一のUIViewControllerでビューを切り替えるだけです。新しい画面に切り替えた後でドリルダウンし、これらの画面をすべてナビゲーション目的でUINavigationViewControllerの階層の一部にする必要があります。

私はこれに新しいので、私は間違った方法で物事を考えている可能性があります。したがって、疑問。私はこのデザインが多少共通していると確信しています。だから間違いなく多くの方法がありますが、私はベストプラクティスを探しています。ここで重要なことは、スイッチが作成された後、ユーザーはUINavigationViewControllerの階層内をさらに下に移動し、バックアップをナビゲートできることです。複数のUIViewControllerを読み込む必要があります。私は信じている。

時間のおかげで多くの感謝(と長いポストのお詫び)。

答えて

1

あなたが質問を正しく理解している場合は、ナビゲーションコントローラのスタックの上部にある2つのビューコントローラを切り替える必要があります。ナビゲーションコントローラに作業をさせて、setViewControllers:animated:を使用して、既存の配列の最後のView Controllerだけを置き換えるのはどうでしょうか?

例、(SubListViewControllerで)追加の​​フリップアニメーションで:

- (void)switchToSettings:(id)sender 
{ 
    [UIView transitionWithView:self.navigationController.view duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^ { 
     SettingsViewController *settingsVC = [[[SettingsViewController alloc] initWithStyle:UITableViewStyleGrouped] autorelease]; 
     settingsVC.mainListItem = self.mainListItem; 
     NSMutableArray *mutableViewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]; 
     [mutableViewControllers removeLastObject]; 
     [mutableViewControllers addObject:settingsVC]; 
     [self.navigationController setViewControllers:mutableViewControllers animated:NO]; 
    } completion:^(BOOL finished) {}]; 
} 
+0

これは動作しますが、感謝します。私はトランジションを "フリップ"にしたいと思います - このようなビューコントローラを明示的に設定しているときにこのタイプのトランジションを追加することは可能ですか? – jb44

+0

フリップトランジションを追加する答えを編集しました。 – omz

+0

Hmm - フリップしません。瞬時にスワップアウトします。私はペンタブレットを使ってsettingsviewcontrollerを初期化します - それは影響を与えることができますか? – jb44

関連する問題