使用RestKit和JSON填充多个UITable ViewController(第二个表崩溃的应用程序)

时间:2013-01-18 05:22:31

标签: ios objective-c json uitableview restkit

我正在使用网站API来填充我的tableViews,使用Restkit和JSON将请求/接收/解析数据填充到我的模型中。已经设置了似乎工作正常的模型和映射。

问题是在初始表视图加载Section&行,我需要第二个tableView来使用从tableView中选择的单元格/行,以显示与在第二个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;
}

但是如果我选择一个单元格,第二个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];
    }
}

1 个答案:

答案 0 :(得分:2)

您需要将故事板中的原型行与下一个视图控制器相关联,命名segue并使用prepareForSegue传递必要的数据。无需didSelectRow...

要引用该行,请使用

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

(我不会依赖行的选定状态。你会混合使用View和Model域,违反MVC原则。)

另外,我注意到了一个逻辑错误。如果你想在VC2中显示联赛作为桌面上的部分和团队查看行,你应该选择体育而不是联盟。一个联盟没有很多联赛,对吗?