Segue 不将数据传递到目的地

Posted

技术标签:

【中文标题】Segue 不将数据传递到目的地【英文标题】:Segue not passing data to destination 【发布时间】: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 【参考方案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];

【讨论】:

以上是关于Segue 不将数据传递到目的地的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 VC 传递到 VC segue

准备 segue 传递数据 nil

使用委托将数据从模态视图传递到父视图(在情节提要中使用 segue)

使用 Segue 从前一个 View Controller 传递到另一个 View Controller 时,数据变为 Nil

与 segue 一起传递数据

如何在 Swift 中通过 Segue 将数据传递到下一个视图?