0

WebサイトAPIを使用してtableViewにデータを入力し、RestkitとJSONを使用してデータをモデルにリクエスト/受信/解析しています。正常に機能しているように見えるモデルとマッピングをすでに設定しています。

問題は、セクションと行をロードする最初のテーブルビューの後で、2番目のtableViewで選択された特定のリーグに関連付けられたチームを表示するために、tableViewから選択されたセル/行を使用する2番目のtableViewが必要です。

私はそれが...だと思います

  • (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

それは次のとおりですので、私は持っていないか、正しいです。

初期画面にデータを正しく入力する:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return sports.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    Sport *sport = [sports objectAtIndex:section];
    return sport.leagues.count;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{
    Sport *sport = [sports objectAtIndex:section];
    return sport.name;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"standardCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    Sport *sport = [sports objectAtIndex:indexPath.section];
    League *league = [sport.leagues objectAtIndex:indexPath.row];
    cell.textLabel.text = league.name;

    return cell;
}

しかし、セルを選択すると、2番目のViewControllerは空白のtableViewになります(注:以前のViewController tableViewコードにはprepareForSegueまたはdidSelectRowAtIndexPathコードがないため、この空白のtableviewが表示される可能性があると思います)。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return leagues.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    League *league  = [leagues objectAtIndex:section];
    return league.teams.count;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{
    League *league = [leagues objectAtIndex:section];
    return league.name;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"standardCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    League *league = [leagues objectAtIndex:indexPath.section];
    Team *team = [league.teams objectAtIndex:indexPath.row];
    cell.textLabel.text = team.name;

    return cell;
}

または、前のViewControllerにprepareForSegueとdidSelectRowAtIndexPathコードを追加し、次のViewControllerに移動するセルを選択すると、アプリがクラッシュします(prepareForSegueとdidSelectRowAtIndexPathコードは確かに正しくありません。私は、何かをつなぎ合わせようとしていましたが、少なくともいくつかは間違っていました):

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    TeamsViewController *teamsViewController = [[TeamsViewController alloc] initWithNibName:@"TeamsViewController" bundle:nil];
    teamsViewController.title = [[sports objectAtIndex:indexPath.row] objectForKey:@"sports"];

}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"leagueDetail"]) {
        TeamsViewController *tvc = [segue destinationViewController];
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        tvc.data = [self.navigationController objectInListAtIndex:indexPath.row]
}

私が遭遇しているのは、選択したセルがその情報を次のtableViewに渡す必要があることだと思います。そのために、データを取得しているbaseURLにその情報を追加する必要があるかどうかはわかりません。選択した行、そして何とかしてチームのtableViewにデータを表示します。しかし、それが問題であるかどうか、および/またはそれをどのように正確に実装するかはわかりません。

助けていただければ幸いです。さらにコードや詳細が必要な場合はお知らせください。誰でもすぐに入手できれば幸いです。

編集:これが私の更新されたprepareForSegueコードですが、まだエラーがあります- エラー:プロパティ「リーグ」がタイプ「TeamsViewController」のオブジェクトに見つかりません

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"leagueDetail"]) {

        // note that "sender" will be the tableView cell that was selected
        UITableViewCell *cell = (UITableViewCell*)sender;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

        TeamsViewController *tvc = (TeamsViewController *)[segue destinationViewController];
        tvc.leagues = [leagues objectAtIndex:indexPath.section];
    }
}
4

1 に答える 1

2

ストーリーボードのプロトタイプ行を次のビューコントローラーにリンクし、セグエに名前を付けてprepareForSegue、必要なデータを渡すために使用する必要があります。の必要はありませんdidSelectRow...

行を参照するには、

[self.tableView indexPathForCell:(UITableViewCell*)sender]

(行の選択された状態に依存しません。MVCの原則に違反して、ビュードメインとモデルドメインを混在させることになります。)

また、ある論理的な間違いに気づきました。VC2で、テーブルビューの行のセクションとチームとしてリーグを表示する場合は、実際にはリーグではなくスポーツを選択する必要があります。リーグには多くのリーグがありませんよね?

于 2013-01-21T12:48:07.033 に答える