dismessViewControllerAnimated不起作用

时间:2014-02-21 03:43:06

标签: objective-c ios7 segue

我正在使用UIImagePickerController,并尝试从didFinishPickingMediaWithInfo中获取图像,然后进入另一个场景以显示图像和编辑过的图像。

我的didFinishingPickingWithMediaInfo方法如下所示:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    if ([[info objectForKey:UIImagePickerControllerMediaType] isEqual: @"public.image"]) {
        imageInfo = info;
        //Dismess pickerView
        [picker dismissViewControllerAnimated:YES completion:^(void){
            NSLog(@"dismissed picker control successfully");
        }];
        //Perform segue
        [self performSegueWithIdentifier:@"imageSegue" sender:self];
}

然后我按照以下方式进入prepareForSegue方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqual: @"imageSegue"]) {

        ImageViewController *ivc = [segue destinationViewController];
        ivc.imageInfo = self.imageInfo;
}

我厌倦了在dismissViewControllerAnimated的末尾添加一个完成块来记录它是否完成并且它只是跳过那个块从不关闭pickerView,因此不会预先形成segue。

不确定为什么......有什么想法?

1 个答案:

答案 0 :(得分:0)

这是要理解的事情。这里出现的代码行的顺序不是它们实际执行的顺序:

[picker dismissViewControllerAnimated:YES completion:^(void){
    NSLog(@"dismissed picker control successfully");
}];
//Perform segue
[self performSegueWithIdentifier:@"imageSegue" sender:self];

dismissViewController 启动解雇,但您已指定要动画,这非常耗时(甚至在您的所有代码之前都不会启动已完成运行)。同时代码上正确。所以我们马上到达performSegue!因此,解雇永远不会有机会完成。事实上,它甚至从来没有机会开始。

保证订单的方法是在解雇后(即performSegue解雇后,将您想要的事情发生。那就是,不要把它放得太精确,正是完成块 for ;在解雇完成之前,保证的代码才会运行。