【问题标题】:Segue not passing data to destinationSegue 不将数据传递到目的地
【发布时间】:2013-10-14 15:58:56
【问题描述】:

我有两个表格视图控制器,一个包含所有美国州,另一个显示所选州的数据列表。我已经从视图控制器(不是单元格)在我的主故事板中设置了一个 segue,并给它一个标识符。由于超出本文范围的原因,我需要在不使用 prepareForSegue 方法的情况下以编程方式执行 segue。

源表视图控制器(AllStatesTableViewController)需要在tableview的didSelectRowAtIndexPath方法中执行segue。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    stateID = [statesDict objectForKey:cell.textLabel.text];

    DetailTableViewController *destination = [[DetailTableViewController alloc] init];

    stateGauges = [[GaugeList alloc] initWithStateIdentifier:stateID andType:nil];
    // at this point stateGauges is NOT nil

    [destination setStateGauges:stateGauges];

    [self performSegueWithIdentifier:@"sgShowStateDetail" sender:self];
}

segue 按预期执行,因为它导航到其目的地,但 stateGauges 在目标表视图控制器中为 nil。在源表视图控制器中它不是 nil。 stateGuages 被声明为 DetailTableViewController 中的属性。显然我做错了什么。有什么建议吗?

谢谢! V

【问题讨论】:

  • 你需要使用-prepareForSegue

标签: ios objective-c xcode ios6 uistoryboardsegue


【解决方案1】:

在您的故事板上,您需要选择将您的转场从您的单元格中推出。

并使用您的prepareForSegue 传递数据:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{
    if ([segue.identifier isEqualToString:@"showDetail"]) 
    {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        DetailTableViewController *detailTableViewController = segue.destinationViewController;

        // Pass data here
        destViewController.stateGauges = stateGauges;
    }
}

查看here了解更多信息

【讨论】:

  • 在以编程方式执行 segue 时,从单元格推送会导致导航控制器出现问题。它会导致以下结果:嵌套推送动画可能导致导航栏损坏。见this post
  • 你可以在prepareForSegue的视图中嵌入一个导航控制器
  • 不幸的是,使用 prepareForSegue 会导致网络活动指示器出现奇怪的问题。建议我们不要因为这个原因使用 prepareForSegue
  • 你没有在你的问题中指定这个 :) 但是,我不喜欢 Storyboard... 使用 XIB 啊 :)
  • 好的,所以我快速浏览了一下,抱歉。在您的详细视图中,您的财产声明stateGauges 是什么?你在哪里初始化这个属性?
【解决方案2】:

我以前也遇到过。我发现当我让故事板处理转场时,它会实例化一个新的视图控制器。这就是为什么 stateGauges 为 nil 的原因,因为您在以编程方式创建的视图控制器中设置了 stateGauges,而不是故事板创建的那个。如果您不使用 prepareForSeque,请从您的 AllStatesViewController 中删除 segue 到情节提要中的 DetailTableViewController。然后以编程方式实例化故事板、视图控制器、setGauges,然后呈现您的视图控制器。此外,请确保将“ShowStateDetail”放在情节提要中该 DetailTableViewController 的身份部分的“情节提要 ID”字段中。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    stateID = [statesDict objectForKey:cell.textLabel.text];

    DetailTableViewController *destination = [[UIStoryboard storyboardWithName:@"yourStoryBoardName" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"ShowStateDetail"];

    stateGauges = [[GaugeList alloc] initWithStateIdentifier:stateID andType:nil];

    [destination setStateGauges:stateGauges];

    [self presentViewController:destination animated:YES completion:nil];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多