-(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的方法实现。
答案 0 :(得分:1)
问题是由于dismissModalViewControllerAnimated
和presentModalViewController
被一个接一个地调用。
解雇操作需要一些时间,因为它必须为被解雇的视图设置动画。在动画期间,它仍然是顶级的模态视图。因此,在此期间您无法呈现另一个模型视图。如果您尝试,则呼叫失败并且不执行任何操作。
要修复,请使用[self dismissModalViewControllerAnimated:NO];
,即不动画。
如果您仍想要动画,请遵循以下解决方案之一:
Problem opening new ViewController after UIImagePickerController
答案 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];
因为两者都是在同一个运行循环中完成的。
我建议这样做:
定义一个封装对presentModal ...
的调用的方法- (void)presentPicker:(...)picker {
[self presentModalViewController:imagePicker animated:YES];
}
将原始调用替换为presentModal ... with:
[self performSelector:@selector(presentPicker:) withObject:picker afterDelay:0.0];
说明:通过我建议的方式使用performSelector
,我们只是在运行循环中对presentPicker进行调用(实际上没有任何延迟,因为我们将0.0指定为延迟值)。通过这种方式,我们为UIKit提供了一个机会来解除模态视图并在之前完成所有必要的清理,然后我们尝试呈现下一个模态视图。
将presentPicker
定义为方法的原因是performSelector
仅允许指定一个参数(而不是presentModal...
要求的两个参数)。
希望这有帮助。