3

在我的故事板中,我有一个 NavViewController,它将根视图设置为 ViewController1。然后 ViewController1 使用标识符“socialSeg”向 ViewController2 推送 segue。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 上运行它们?

编辑:我试图缩短我的问题以使帖子更短,我意识到您可能需要更多上下文。

这是我的完整故事板。基本上“视频视图控制器”是 ViewController1,“社交视图控制器”是 ViewController2。当我单击“根视图控制器”按钮(录制视频)时,该 segue 工作正常,这就是我忽略它的原因。“根视图控制器”有没有可能把事情扔掉?

4

1 回答 1

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];
    });
}

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

这是一个相关的问题和答案:performSegueWithIdentifier not working

于 2013-09-19T04:03:57.383 回答