【问题标题】:Can't get UIImagePickerController to work?无法让 UIImagePickerController 工作?
【发布时间】:2012-07-22 12:33:09
【问题描述】:
-(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 的方法实现。

【问题讨论】:

  • 创建后是不是imagePicker nil ?

标签: objective-c ios5 uiimagepickercontroller


【解决方案1】:

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

关闭操作需要一些时间,因为它必须为被关闭的视图设置动画。在动画期间,它仍然是顶部的 Modal View。因此,您不能在此期间呈现另一个模型视图。如果您尝试,则呼叫失败并且什么也不做。

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

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

Problem opening new ViewController after UIImagePickerController

Correct way of showing consecutive modalViews

【讨论】:

    【解决方案2】:

    编辑:

    如果使用故事板,您应该在您的委托中定义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... 的调用替换为:

       [self performSelector:@selector(presentPicker:) withObject:picker afterDelay:0.0];
      

    解释:通过我建议的方式使用performSelector,我们只是在运行循环中对presentPicker的调用排队(实际上没有任何延迟,因为我们指定0.0作为延迟值)。通过这种方式,我们让 UIKit 有机会关闭模态视图并在我们尝试呈现下一个模态视图之前进行所有必要的清理

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

    希望这会有所帮助。

    【讨论】:

    • 塞尔吉奥,这是一个绝妙的主意!虽然,不幸的是它没有工作。 :( 我担心使用模块化 segue 与 ImagePicker 不兼容?
    猜你喜欢
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2014-12-26
    • 2017-12-22
    • 2012-02-28
    • 2015-12-01
    相关资源
    最近更新 更多