0

ストーリーボード階層をプログラムでトラバースするのに助けが必要です。この画像は、ストーリーボードというコンテキストを提供する必要があります。階層は、マスターが 3 つのタブを持つ tabViewController である splitViewController で構成されます。最初のタブには 2 つのコンテナー ビューが含まれており、下のビューは「問題のある子」です。

階層をトラバースし、detailViewController に masterViewController をタブ 2 と 3 のデリゲートとして割り当てることに成功しました。

UISplitViewController *splitViewController = (UISplitViewController *) self.window.rootViewController;
    UITabBarController *masterTabBarController = [[splitViewController viewControllers] objectAtIndex:0];
MasterViewController *masterViewController2 = [[masterTabBarController viewControllers] objectAtIndex:1];
MasterViewController *masterViewController3 = [[masterTabBarController viewControllers] objectAtIndex:2];
masterViewController2.delegate = detailTableViewController;
masterViewController3.delegate = detailTableViewController;

ただし、タブ 1 は、コンテナー ビューのために、より面倒です。私の試みはうまくいかず、index-out-of-bounds エラーが発生します。

UIViewController *containerViewController = [[masterTabBarController viewControllers] objectAtIndex:0];
MasterViewController *masterViewController1 = [[containerViewController childViewControllers] objectAtIndex:1];
masterViewController1.delegate = detailTableViewController;

そのため、AppDelegate の代わりに、MasterViewController 内で別の 2 つのルートも試しました。

- (void)viewDidLoad
{
    self.delegate = (DetailTableViewController *)[[self.splitViewController.viewControllers lastObject] presentedViewController];

//self.delegate = [[self.parentViewController.parentViewController.parentViewController.childViewControllers objectAtIndex:1] objectAtIndex:0]; Granted this should ONLY work for tab 1...but it doesnt.
}

しかし、コメントされていない行は nil を返します...

だから私は、親切な魂がコンテナビューを理解していることを望んでいます(これらについては驚くほど詳細が見つかりません)。より良い方法が必要です。ここにあるのは非常に小さなアプリです。何十もの画面がある複雑なアプリの階層を個別に歩かなければならないことは想像できません。

前もって感謝します!!

4

2 に答える 2

0

問題の解決策を見つけるために、すべての接続とコードが適切に設定されていることを確認しながら、新しいストーリーボードで問題を小規模に模倣しようとしました。次に、コンテナー ビューをセットアップしていたときに、次のことがわかりました。

ストーリーボードでは、コンテナー ビューは自動的に "埋め込みセグエ" として定義され、格納されている画面とは技術的に関連していません。したがって、単純に「親」ビューの子を要求して、コンテナー ビューの配列が返されることを期待することはできません。

そこで、問題のコンテナ ビューにデータを渡し、デリゲートを定義するために、コンテナ ビューを格納するビューのカスタム クラスを作成し、AppDelegate を完全に無視しました。このクラスでは、prepareForSegue 関数を定義しました。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    SingletonObject *data = [[SingletonObject alloc] init];

    if([segue.identifier isEqualToString:@"containerView1SegueID"])
    {

    }
    else if([segue.identifier isEqualToString:@"tableEmbedSegue"])
    {
        MasterViewController *masterViewController0 = segue.destinationViewController;

        [[segue destinationViewController] setDelegate:data.detailTableViewController];
        // ^ Or more specifically, 'masterViewController0.delegate = data.detailTableViewController;' would also work
    }
}

これが、コンテナ ビューで問題を抱えているすべての人に役立つことを願っています。彼らは子供ではありません!それらは埋め込みセグエです。prepareForSegue を使用してください。

于 2013-06-04T20:24:28.357 に答える
0

解決策はありませんが、詳しく説明するスペースが増えるため、これを回答として書いています。

あなたが提供したストーリーボードの画像と比較すると、あなたのコードは正しいようです。私はストーリーボードに慣れていませんが、プログラムですべてをセットアップすることを好むので、間違っている可能性があります。しかし: ストーリーボードを複製しようとしている簡単なテスト プロジェクトを作成しました。次に、コードをコピーして貼り付けて、逐語的にテスト プロジェクトに取得masterViewController1しました。すべてが完全に機能します。

結論: ストーリーボードの何かが間違った方法で設定されています。または、ここに示されていないコード内の何かによって、コンテナーと子の関係が予期せず変更されます。

私のアドバイス: 絵コンテを見直してください。間違いが見つからない場合は、おそらく別のプロジェクトで、新しいストーリーボードをゼロから開始してください。簡単に始めて、各ステップを確認します。正しい設定に到達したら、新しい絵コンテと古い絵コンテを比較して間違いを見つけることができます。

これが非常に一般的なアドバイスであることは承知していますが、現在の状況を考えると、他に何ができるかわかりません. 幸運を。

于 2013-05-31T22:41:55.020 に答える