0

ここに見られるように、コンテナ ビュー内に格納されている tableViewController にデータを渡すのに問題があります。
ここに画像の説明を入力
コンテキストについては、2 つのコンテナ ビューを含むビュー コントローラ自体が、 splitViewController の詳細ビュー。

まず第一に、コンテナビューを適切に使用していますか? この最初のタブの目的は、上部にいくつかのフィルター「設定」を表示することです。これは、プッシュ セグエを介して編集できます (したがって、ナビゲーション コントローラーです)。下部では、フィルター条件に基づいて tableView のデータが更新されます。この機能を実現するために 2 つのコンテナー ビューを使用するのは直感的に思えましたが、経験がほとんどなく、より良い方法があるかどうか、またはコンテナー ビューのユーティリティが見た目よりもニッチなものであるかどうかはわかりません。

元の質問に-この階層が理にかなっていると仮定すると、この特定のtableViewControllerにデータを渡すのに苦労しています。tabViewController には他に 2 つのタブがあり、どちらもコンテナー ビューを使用していないため、次のように appDelegate を使用してこれらのタブにデータを表示するために階層を正常にトラバースすることができました。

// Initial Setup
    UISplitViewController *splitViewController = (UISplitViewController *) self.window.rootViewController;
    UITabBarController *masterTabBarController = [[splitViewController viewControllers] objectAtIndex:0];

    // Tab 1: Filter by Location:
    // >>> **PROBLEM CODE SEGMENT** <<<
    UIViewController *containerViewController = [[masterTabBarController viewControllers] objectAtIndex:0];
    MasterViewController *masterViewController0 = [[containerViewController childViewControllers] objectAtIndex:1];
    masterViewController0.slotMachines = machines;

    // Tab 2: Filter by ID#:
    MasterViewController *masterViewController1 = [[masterTabBarController viewControllers] objectAtIndex:1];
    masterViewController1.slotMachines = machines;

    // Tab 3: Audited
    MasterViewController *masterViewController2 = [[masterTabBarController viewControllers] objectAtIndex:2];
    masterViewController2.slotMachines = machines;

デリゲートを介して masterViewController0/1/2 のそれぞれにデータを割り当てるコードのスニペットはスキップしました。前述のように、タブ 2 と 3 が機能します。タブ 1 は実行時にプログラムを中断し、'[containerViewController childViewControllers]' が空の配列を返すために終了します。プログラム実行のこの時点でコンテナビューが初期化されていないのだろうか?しかし、正直なところわかりません。

私のクエリは特にコンテナー ビューとはあまり関係がなく、階層トラバーサルと関係があると思います。そのため、コンテナー ビューに関するドキュメントで解決策を調べても、実際にはあまり役に立ちませんでした。

ヒントをお寄せいただきありがとうございます。

4

1 に答える 1

1

データの受け渡しが複雑になっていることがわかった場合は、すべてのビュー コントローラーがアクセスできるシングルトン オブジェクトを作成し、それを仲介してデータ オブジェクトを受け取り、販売します。これを行うには、キー/値またはその他のスキームを使用できます。

編集:これは本当に簡単です。クラス Foo を定義し、クラスにシングルトンを作成させ、任意のクラスがそれを取得する方法を提供します(Foo *foo = [Foo sharedFoo])。サポートするメソッドをシングルトンに追加し、 のsetObject:forKey:ようobjectForKey:NSMutableDictionary、または必要なものを追加します。これをスレッドセーフにする必要がある場合は、より困難ですが似ています-その場合、すべてのアクセスにシリアルディスパッチキューを使用する必要があります。上記の各手法には、SO に関する多くの投稿があります (シングルトン、シリアル ディスパッチ キューのスレッド化など)。

これで、すべてのクラスに Foo.h を含め、シングルトンにアクセスして、何かを要求したり提供したりできるようになりました。

于 2013-05-28T16:36:47.977 に答える