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 不将数据传递到目的地的主要内容,如果未能解决你的问题,请参考以下文章
使用委托将数据从模态视图传递到父视图(在情节提要中使用 segue)
使用 Segue 从前一个 View Controller 传递到另一个 View Controller 时,数据变为 Nil