0
-(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");
}

尽管我的视图控制器是 UINavigationController 和 UIImagePickerDelegate 的子类,但除了 NSLog 之外什么都没有发生。有没有人对 UIImagePickerController 有任何见解或经验?

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

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

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

4

2 回答 2

1

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

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

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

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

在 UIImagePickerController 之后打开新 ViewController 的问题

显示连续模态视图的正确方法

于 2012-07-24T09:24:37.327 回答
0

编辑:

如果使用故事板,您应该prepareFroSegue在您的委托中定义:

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

    playerDetailsViewController.delegate = self;
}
}

来源

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

[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...需要的两个)。

希望这可以帮助。

于 2012-07-24T08:28:07.970 回答