【问题标题】:Using RestKit and JSON to populate more than one UITable ViewController (second Table is crashing app)使用 RestKit 和 JSON 填充多个 UITable ViewController(第二个 Table 正在崩溃的应用程序)
【发布时间】:2013-01-01 19:19:54
【问题描述】:

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

问题是在加载 Section & Row 的初始表格视图之后,我需要第二个 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];
    }
}

【问题讨论】:

  • 太棒了!它在没有产生任何诊断消息的情况下崩溃!

标签: ios objective-c json uitableview restkit


【解决方案1】:

您需要将情节提要中的 Prototype Row 与下一个视图控制器链接,命名 segue 并使用 prepareForSegue 传递必要的数据。不需要didSelectRow...

要引用该行,请使用

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

(我不会依赖行的选定状态。您将混合视图和模型域,违反 MVC 原则。)

另外,我注意到一个逻辑错误。如果在 VC2 中您想将联赛显示为表格视图行上的部分和球队,您应该选择 Sport 而不是联赛。一个联赛没有多少联赛,对吧?

【讨论】:

  • 非常感谢您的回复!如果我想正确的话,原型行是“标准单元”吗?如果是这样,我将使用“standardCell”作为第一个 VC 中的联盟单元,以及作为第二个 VC 中的团队单元......所以我需要将它们分开(即,将第一个 VC 中的标准单元更改为类似 LeagueCell,并且第二个VC到teamCell)?下一部分,我确实将 segue 命名为 ("leagueDetail") 并通过标识符连接到情节提要。感谢您澄清不需要 didSelectRow。最后,您建议的代码,我会将其放在第一个 VC 中的 prepareForSegue 代码的末尾?
  • 另外,是的,您在逻辑错误上是正确的。我希望做的和要去的地方是显示联盟被选为 2nd VC 球队的部分(即 NBA 被选为联盟,下面列出了 NBA 球队
  • 不,代码是获取indexPath。使用 sectionrow 找到正确的数据并将其传递到您的详细信息视图。 --(别忘了在上面打勾。)
  • 所以当我使用 'NSIndexPath *indexPath = [self.tableView indexPathForCell:indexPath.row' 时,它会给我一条错误消息,上面写着“'NSInteger'(又名'int')到'的隐式转换ARC 不允许使用 UITableViewCell'。”不确定如何解决这个问题,或者我是否按照您的建议那样做?
  • 我觉得我已经很好地处理了prepareForSegue,直到我到达我现在获得所选索引的部分,然后还有我通过所选联赛的名称和索引
猜你喜欢
  • 2015-12-28
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多