performSegueWithIdentifier触发但不加载下一个视图

时间:2013-09-19 03:27:25

标签: iphone ios objective-c

在我的故事板中,我有一个NavViewController,它将根视图设置为ViewController1。 ViewController1然后使用标识符“socialSeg”推送到ViewController2。 ViewController1有一个UIImageView,用于加载摄像机。用户录制视频并选择“使用”后,我想加载下一个视图控制器。在ViewController1.m中,我有以下内容:

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{
    NSLog(@"Performing Segue with ID");
    [self performSegueWithIdentifier:@"socialSeg" sender:self];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@"Prepping");
}

两个NSLog都运行,但我的屏幕上没有任何反应。我没有看到ViewController2,也没有弹出错误消息。我这样做是对的吗?

相关问题:我应该在self(当前的ViewController)上运行performSegueWithIdentifier,还是应该在self.navigationController上运行?

编辑:我试图缩短我的问题,以缩短帖子,我意识到你可能需要更多的背景。

这是我的full storyboard。基本上“Video View Controller”是ViewController1,“Social View Controller”是ViewController2。当我点击“根视图控制器”按钮(录制视频)时,该segue工作正常,这就是我将其删除的原因。 “根视图控制器”是否有可能丢掉任何东西?

1 个答案:

答案 0 :(得分:3)

您的performSegue代码没有任何问题。当您执行此Segue时,似乎您的选择器动画仍在运行。请尝试通过修改您当前的通话,在performSegue的完成区中致电presentViewController

[imagePickerController presentViewController:YES completion:^() {
    NSLog(@"Performing Segue with ID");
    [self performSegueWithIdentifier:@"socialSeg" sender:self];
}];

请确保将imagePickerController替换为弹出式图像选择器控制器的名称。

它不是理想的解决方案,但您也可以延迟执行您的performSegue,以确保您的图像选择器动画已停止:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
   //1.5 is number of seconds its going to wait before executing the block of code
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.5 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
        NSLog(@"Performing Segue with ID");
        [self performSegueWithIdentifier:@"socialSeg" sender:self];
    });
}

注意: 问题是图片选择器弹出动画仍在进行中(在用户选择图像或视频后关闭选择器){ {1}}尝试启动另一个动画以加载下一个视图控制器。由于一个动画尚未完成,因此performSegue动画被忽略,视图控制器无法加载。

以下是相关的问题和答案: performSegueWithIdentifier not working