【问题标题】:Runtime Issue - "Nested push animation" when using performSegueWithIdentifier运行时问题 - 使用 performSegueWithIdentifier 时出现“嵌套推送动画”
【发布时间】:2012-02-18 00:54:14
【问题描述】:

我有一个 NavigationController,其中有一个 TableView。电视中的单元格有一个“模态”segue,它指向一个 TableViewController(类: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 - 我正在使用带有 ARC 的 Xcode 4.2,iOS 5

【问题讨论】:

    标签: iphone objective-c ios storyboard segue


    【解决方案1】:

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

    【讨论】:

    • +1000。 “不要将它直接链接到表格单元,而是链接到视图控制器”
    【解决方案2】:

    如果情节提要中有模态转场,则不需要 didSelectRowAtIndexPath: 中的代码。故事板将完成所有其余的工作。如果您尝试手动进行转场并将其放在情节提要中,则会遇到问题。

    【讨论】:

    • 好吧,我想我知道你现在在说什么了。你想要一个模态序列的外观,但有一个后退按钮就像一个推。您不能同时为同一视图设置故事板转场和手动转场。您正在强制导航同时使用相同的视图控制器对象两次。您需要从 didSelectRowAtIndexPath 代码中删除该代码。然后,您可以通过以下两种方式之一处理其余部分。如果您想要模态外观,请在导航栏的左侧放置一个自定义按钮。或者,如果您对推送转换没问题,请将情节提要转场更改为推送类型。
    • Rob - 你明白了,你描述的行为(同时两次)正是正在发生的事情。我有工作代码,我将在今晚发布。谢谢!
    【解决方案3】:

    您是否覆盖了viewWillAppear/viewDidAppear/viewWillDisappear/viewDidDisappear?你还记得从你的覆盖中调用super吗?

    【讨论】:

    • 我“认为”的原因是我有一个故事板推送转场 && 我称之为 performSegueWithIdentifier - 这可能会创建两次转场?如果是这种情况,是否有另一种方法可以将对象数据传递到目的地而不使用 performSegueWithIdentifier?
    • Rob - 虽然你的回答没有解决我的问题,但它确实激发了一些思考过程!我已经解决了这个问题 - 我会立即发布答案。谢谢。
    【解决方案4】:

    我有 segues 正在返回导致此问题的主导航控制器。我通过将主导航控制器设置回堆栈顶部来解决问题。代码如下:

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

    【讨论】:

      【解决方案5】:

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

      我复制了一个按钮,然后连接了它。它有效,但我确实收到了这个错误。

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

      【讨论】:

        【解决方案6】:

        我遇到了这个问题,当我不小心两次推送到下一个 viewController 时。 这发生了,当我忘记删除我用于测试的推送 segue 时。因此,在进行任何其他操作之前,请检查您是否手动推送了两次愚蠢的错误

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-17
          • 1970-01-01
          • 2012-11-03
          • 2016-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-18
          相关资源
          最近更新 更多