使用 unwind segues 推送数据
Posted
技术标签:
【中文标题】使用 unwind segues 推送数据【英文标题】:Pushing data with unwind segues 【发布时间】:2015-01-04 04:20:00 【问题描述】:我有一个正在使用的 unwind segue,然后我有一个准备用于推送数据的 segue。 我需要 unwind segue 来推送数据,但我在组合它们时遇到了问题。 这是展开的 segue 代码 -
- (IBAction)unwindFromDetailViewController:(UIStoryboardSegue *)segue
// ViewController *detailViewController = [segue sourceViewController];
NSLog(@"%@", segue.identifier);
这是segue代码的准备-
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"showRecipeDetail"])
NSIndexPath *indexPath = nil;
Recipe *recipe = nil;
if (self.searchDisplayController.active)
indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
recipe = [searchResults objectAtIndex:indexPath.row];
else
indexPath = [self.tableView indexPathForSelectedRow];
recipe = [recipes objectAtIndex:indexPath.row];
PersonDetailTVC *destViewController = segue.destinationViewController;
destViewController.recipe = recipe;
[self dismissViewControllerAnimated:YES completion:nil];
这是我尝试的方法,它正在展开 segue,但不推送数据。
- (IBAction)unwindFromDetailViewController:(UIStoryboardSegue *)segue
if ([segue.identifier isEqualToString:@"CustomTableCell"])
NSIndexPath *indexPath = nil;
Recipe *recipe = nil;
if (self.searchDisplayController.active)
indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
recipe = [searchResults objectAtIndex:indexPath.row];
else
indexPath = [self.tableView indexPathForSelectedRow];
recipe = [recipes objectAtIndex:indexPath.row];
PersonDetailTVC *destViewController = segue.destinationViewController;
destViewController.recipe = recipe;
[self dismissViewControllerAnimated:YES completion:nil];
【问题讨论】:
你一直在转发同样的问题,但我已经将你引导到这篇文章,并提供了许多关于同一主题的答案——“我可以在展开 segue 时返回数据吗?” ***.com/q/13038622/2274694 。我建议你检查一下。 如果你的问题没有得到回答,我建议你把同样的问题重新发布 3 次,让它更清楚。 您是否专门为您的 unwind segue 设置了标识符?我怀疑您只是在使用您的 segue 标识符,并且您在prepareForSegue
中的 if ([segue.identifier isEqualToString:@"showRecipeDetail"])
返回 false ,因此该块根本没有执行。 (这一行:[self dismissViewControllerAnimated:YES completion:nil];
完全没有必要。)
【参考方案1】:
您的问题相当不完整,所以我只能根据假设来回答......
首先,这个方法应该在你要返回到的视图控制器中。
- (IBAction)unwindFromDetailViewController:(UIStoryboardSegue *)segue
其次,使用您的 prepareForSegue:
方法,而不是您的 unwindFromDetailViewController:
方法(属于第一个视图控制器),从第二个视图控制器传递您的数据。我相信尽管您在 if ([segue.identifier isEqualToString:@"showRecipeDetail"])
语句中使用了前向转场标识符而不是展开转场标识符,但它因此返回 false,因此您的 prepareForSegue:
方法中的整个块根本没有执行。 (这一行:[self dismissViewControllerAnimated:YES completion:nil];
完全没有必要,因为只要一切都正确连接,展开就会自动发生。)所以现在尝试删除条件,看看数据是否按预期传递,例如:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
NSIndexPath *indexPath = nil;
Recipe *recipe = nil;
if (self.searchDisplayController.active)
indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
recipe = [searchResults objectAtIndex:indexPath.row];
else
indexPath = [self.tableView indexPathForSelectedRow];
recipe = [recipes objectAtIndex:indexPath.row];
PersonDetailTVC *destViewController = segue.destinationViewController;
destViewController.recipe = recipe;
如果你想重新添加一个条件来指定检查你的 segue 的标识符,你必须专门为 unwind segue 设置一个标识符。
【讨论】:
我尝试了你建议的 prepareforsegue,但它仍然没有通过 unwind segue 传递信息,我不知道我是否只是不明白你在说什么或什么。但它仍然什么都不做。 就像我说的那样,您的问题不完整,例如:unwindFromDetailViewController:
在您要展开的视图控制器中吗?你确定你的segue设置正确吗?您确定正在调用prepareForeSegue
吗?您是否设置了断点或 nslog 来检查?您如何确定数据尚未通过?您需要提供更多信息...
我在我正在展开的视图控制器中有展开 segue 并在我正在展开的视图控制器中有 prepareforsegue,但是没有推送 segue 我应该如何将信息从第二个传递到第一个放松的?\
@mattsuff 展开是自动的。 (我自己测试过。一切都对我有用。传递数据等)
@mattsuff 我建议更新您的问题(不要更改您的原始代码,因为这会使未来的答案寻求者感到困惑),而是添加您在 PersonDetailTVC 中使用的代码以检查从另一个视图控制器传回的新数据。以上是关于使用 unwind segues 推送数据的主要内容,如果未能解决你的问题,请参考以下文章
适配 iOS 8 时遇到的问题两则:远程推送和 Unwind Segue