ios - 当前演示完成后如何执行segue

标签 ios objective-c segue uistoryboardsegue

我的应用程序中有一种情况,我需要通过 unwind segue 关闭模态视图 Controller ,然后立即显示不同的模态视图 Controller 。为此,我只是将显示新 View Controller 的调用延迟 1.0 秒。这可能不会一直有效,也许如果由于某种原因需要更长时间才能关闭,第二个 View Controller 将无法出现,因为正在发生转换。我刚遇到这种情况,尽管它在这种情况下确实有效。这是记录的:

警告:在演示过程中尝试继续演示!

我正在寻找更好的解决方案。我想知道是否可以在第一个 View Controller 完全关闭后通过回调抛出新的 View Controller ,但是没有 performSegueWithIdentifier 具有完成 block 。

我如何关闭模态视图 Controller ,然后再呈现一个新的,始终确保不会发生冲突?

这是我目前的解决方案:

[self performSegueWithIdentifier:@"Unwind Segue" sender:self]; //dismiss modal or pushed VC

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [tabBarController performSegueWithIdentifier:@"Show New VC" sender:self]; //present new modal VC
});

最佳答案

我自己花了一段时间才弄明白这个问题。 iOS 7 引入了 transitionCoordinator,它仅在动画期间出现在 UIViewController 上。简而言之,您必须在主队列的另一个线程中注册您的完成 block (该线程将在动画开始后运行)。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // ... prepare your for segue

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.transitionCoordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
         {
             // Segue animation complete
         }];
    });
}

关于ios - 当前演示完成后如何执行segue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24814025/

相关文章:

ios - 如何在 iOS 中复制 CAlayer 对象?

ios - 在下一个 ViewController 上设置导航栏标题,没有视觉错误

objective-c - 使用 AVPlayer 循环一段视频

ios - 当 iCal 不在后台时,从 iCal 中删除事件不起作用

ios - perfrmSegueWithIdentifier() 在 swift iOS 中不起作用

swift - 计算 UITextField 的字符因 NSException 崩溃

ios - 当文本长度超过iOS中的最大长度时,不会粘贴任何文本

ios - 在 RubyMotion 中子类化 UILabel 以设置 attributedText kerning

java - 将 java 代码转换为 Objective C 的问题

swift - 在我的准备 segue 函数中,数据没有在正确的时间传输