5

最初のテーブル ビューに複数のセクション レイアウトを使用する小さなアプリがあります。1 つのセクションには Twitter の最新のトレンドが表示され、もう 1 つのセクションには Twitter の最新のストーリーが表示されます。トレンド リスト内のアイテムをクリックすると、そのトレンドに関する最新のツイートを表示する新しいテーブル ビュー コントローラーに遷移します。ストーリー セクションのルート コントローラー内で、画像やリンクなどを含む別のビュー コントローラーでより多くの情報を表示できるようにしたいと考えています。問題は、ストーリー セクション内で何かを選択すると、トレンド セクション用に設定されたテーブル ビュー コントローラーにプッシュされることです。各セグエに名前を付け、遷移先のビューの両方にカスタム クラスを用意しました。どのセグエが呼び出されているかを確認するためにこれを実行しています。

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

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

        //get the controller that we are going to segue to
        SearchTrendResultsViewController *strvc = [segue destinationViewController];

        //get the path of the row that we want from the table view
        NSIndexPath *path = [self.tableView indexPathForSelectedRow];

        //here we get the trend object from the array we set up earlier to hold all trends
        Trends *results = [currentTrends objectAtIndex:[path row]];

        //pass the object that was selected in the table view to the destination view
        [strvc setQuery: results];
    }

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

        StoriesViewController *svc = [segue destinationViewController];

        NSIndexPath *path = [self.tableView indexPathForSelectedRow];

        Stories *results = [currentStories objectAtIndex:[path row]];

        [svc setStory:results];
    }
}

さまざまなビューに到達する方法について何か提案はありますか?

4

1 に答える 1

17

あなたの質問には確かに十分な情報がありませんが、これは、私が自動セグエと手動セグエと呼ぶものと、それぞれの制限の問題のように思えます。

自動セグエは、(プロトタイプ) テーブル セルまたはその他のコントロールからドラッグすることにより、IB で作成されます。これの良いところは、それが自動であることです。コントロールをタップするとセグエが実行され、コードで行う必要がprepareForSegue:sender:あるのは、宛先ビュー コントローラーが適切なデータを取得するように実装することだけです。欠点は、特定のコントロール (プロトタイプ テーブル セルを含む) が 1 つの発信セグエしか持てないことです (そうでない場合、ストーリーボードはどれを自動的に実行するかを認識できません)。

ソースビュー コントローラーからドラッグすることにより、IB で手動セグエが作成されます。これの利点は、View Controller が複数の送信セグエを持つことができることです。一方、それらはタップ可能なコントロールに関連付けられていないため、いつ実行するか (およびそれを実行するための呼び出し) を決定するロジックを実装する必要があります。performSegueWithIdentifier:

これらのトレードオフを考慮すると、問題に対する解決策は 2 つあります。

  1. 複数のプロトタイプ テーブル セルを使用すると、それぞれが独自の発信自動セグエを持つことができます。テーブル ビュー コントローラーを変更してtableView:cellForRowAtIndexPath:、インデックス パスのセクション番号を確認し、適切な識別子を選択する必要dequeueReusableCellWithIdentifier:がありますが、トレンド セルとストーリー セルのコンテンツが異なる場合は、これにより便利または効率的になる可能性があります。

  2. 手動セグエを使用します。その後、テーブル ビュー コントローラーは、インデックス パスのセクションに基づいて選択された適切な識別子を使用しtableView:didSelectRowAtIndexPath:て呼び出すように実装できます。performSegueWithIdentifier:

いずれにせよ、prepareForSegue:sender:実装は問題ないようです。

于 2012-04-17T19:06:53.680 に答える