运行时问题 - 使用performSegueWithIdentifier时的“嵌套推送动画”

时间:2012-01-24 19:06:56

标签: iphone objective-c ios storyboard segue

我有一个NavigationController,里面有一个TableView。电视中的单元格有一个“模态”segue,指向TableViewController(Class:Details.h / .m)。当我选择单元格时,我会按预期将其带到TableViewController。

但是我需要添加以下功能:

1)推到目的地所以我得到了一个漂亮的后退按钮 2)将所选单元格中的各种对象信息传递到目的地TVC。

为此,我执行以下任务:

1)将segue改为“push”并给它一个标识符“segueToDetails”
2.1)将代码添加到didSelectRowAtIndexPath方法(下面)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"segueToDetails" sender:self];
}

2.2)将代码添加到prepareForSegue方法(下面)

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
    NSInteger rowNumber = selectedIndexPath.row;

    myObject = (MyObject *) [myArray objectAtIndex:rowNumber];

    Details *details = [segue destinationViewController];
    details.detailsObject = myObject;
}

2.3)确认对象信息正在传递到目的地我使用NSLog输出一些数据(下面)

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"name: %@", detailsObject.name);
}

现在当我运行项目并在表格中选择一个单元格时,我被带到目的地TVC,我看到NSLog的输出很好。我也有一个很好的后退按钮。但等等,当我点击回来时,我有另一个后退按钮!单击该返回按钮然后返回到我最初来自的位置。每次我转到目的地TVC时,调试器窗口都会显示此消息。

2012-01-24 13:55:58.240 MyApp[26875:11603] nested push animation can result in corrupted navigation bar
012-01-24 13:55:58.593 MyApp[26875:11603] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
2012-01-24 13:55:58.593 MyApp[26875:11603] Unbalanced calls to begin/end appearance transitions for <SpotDetails: 0x7a7a370>.

有关如何解决此问题的任何建议?

PS - 我正在使用Xcode 4.2 w / ARC,iOS 5

6 个答案:

答案 0 :(得分:13)

你正在推动观点两次;一次在故事板中,一次在didSelectRowAtIndexPath中。当您在故事板中连接segue时,不要直接将其链接到表格单元格,而是链接到视图控制器,以便您可以以编程方式执行segue,而不是在按下单元格时为您执行此操作的故事板。

答案 1 :(得分:12)

如果故事板中有模态segue,则不需要didSelectRowAtIndexPath:中的代码。故事板将完成剩下的工作。如果您尝试手动执行segue并将其放在故事板中,则会遇到问题。

答案 2 :(得分:3)

您是否覆盖了viewWillAppear / viewDidAppear / viewWillDisappear / viewDidDisappear?您还记得从覆盖中拨打super吗?

答案 3 :(得分:1)

我有segues导致我的主导航控制器导致这种情况。我通过将主导航控制器设置回堆栈顶部来解决问题。这是代码:

- (void) viewDidAppear:(BOOL)animated
{
    [self.navigationController popToRootViewControllerAnimated:NO];
}

答案 4 :(得分:0)

只是想将我的问题解决方案添加到此主题中,以防有人遇到与我相同的问题。

我复制了一个按钮,然后将其连接起来。它工作但我确实得到了这个错误。

原来我错过了取消复制的“新”按钮上的旧连接,所以我有两个连接,新的和旧的。刚刚删除了旧版本并且工作正常。

答案 5 :(得分:0)

我遇到了这个问题,当我意外地两次推送到下一个viewController时。 发生这种情况,当我忘记删除我用于测试的推送segue时。所以在其他任何事情之前检查一下你是否已经手动推两次这个愚蠢的错误