无法让UIImagePickerController工作?

时间:2012-07-24 08:06:31

标签: objective-c ios5 uiimagepickercontroller

-(void) openPhotoLib:(id)sender {
    [self dismissModalViewControllerAnimated:YES];
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    [imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    [imagePicker setDelegate:self];
    [self presentModalViewController:imagePicker animated:YES];
    NSLog(@"openPhotoLib called");
}

除了NSLog之外没有任何事情发生,即使我的视图控制器是UINavigationController和UIImagePickerDelegate的子类。有没有人对UIImagePickerController有任何见解或经验?

我应该注意,我主要使用iPhone进行测试。

解决方案:创建一个仅包含UINavigationBarDelegate和UIImagePickerDelegate的新类。在该类的viewDidAppear中,将代码设置为以模态方式呈现imagePicker。在方法内创建此类的实例(在另一个类中,导入.h文件和所有),并以模态方式显示该类。

^我把它拿回来。模态动画是真正的问题。尝试使用另一个类实例会弄乱UIImagePicker的方法实现。

2 个答案:

答案 0 :(得分:1)

问题是由于dismissModalViewControllerAnimatedpresentModalViewController被一个接一个地调用。

解雇操作需要一些时间,因为它必须为被解雇的视图设置动画。在动画期间,它仍然是顶级的模态视图。因此,在此期间您无法呈现另一个模型视图。如果您尝试,则呼叫失败并且不执行任何操作。

要修复,请使用[self dismissModalViewControllerAnimated:NO];,即不动画。

如果您仍想要动画,请遵循以下解决方案之一:

Problem opening new ViewController after UIImagePickerController

Correct way of showing consecutive modalViews

答案 1 :(得分:0)

编辑:

如果使用故事板,则应在代理中定义prepareFroSegue

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"AddPlayer"])
{
    PlayerDetailsViewController 
      *playerDetailsViewController = 
        (PlayerDetailsViewController *) segue.destinationViewController;

    playerDetailsViewController.delegate = self;
}
}

source

我不确定,但我认为这个电话:

[self dismissModalViewControllerAnimated:YES];

可能会干扰以下电话

[self presentModalViewController:imagePicker animated:YES];

因为两者都是在同一个运行循环中完成的。

我建议这样做:

  1. 定义一个封装对presentModal ...

    的调用的方法
    - (void)presentPicker:(...)picker {
        [self presentModalViewController:imagePicker animated:YES];
    }
    
  2. 将原始调用替换为presentModal ... with:

     [self performSelector:@selector(presentPicker:) withObject:picker afterDelay:0.0];
    
  3. 说明:通过我建议的方式使用performSelector,我们只是在运行循环中对presentPicker进行调用(实际上没有任何延迟,因为我们将0.0指定为延迟值)。通过这种方式,我们为UIKit提供了一个机会来解除模态视图并在之前完成所有必要的清理,然后我们尝试呈现下一个模态视图。

    presentPicker定义为方法的原因是performSelector仅允许指定一个参数(而不是presentModal...要求的两个参数)。

    希望这有帮助。