我无法找出执行某项任务的最有效和“优雅”的方法。问题定义是: 我想显示几个视图,其中一个是带有相机胶卷源的ImagePicker。
层次结构看起来类似于: 主要观点---> PICKER --->图像处理视图 当用户点击“后退按钮”时,UI必须允许后退显示。
我尝试了几种方法:
1
a)MAIN VIEW以模态方式显示选择器视图。 b)在didFinishPickingMediaWithInfo委托方法中,关闭选择器模态视图,然后调用带有IMAGE PROCESSING VIEW的presentModalViewController。
示例代码:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage* pickedImage = [info valueForKey:UIImagePickerControllerEditedImage];
LastViewController* vc = [[LastViewController alloc] init];
vc.mainImage = pickedImage;
[self dismissModalViewControllerAnimated:NO];
[self presentModalViewController:vc animated:NO];
}
问题是,它不起作用,导致控制器在解除另一个模式后无法显示下一个模态(上一个模式不会立即消失,MAIN不立即激活,并且不能呈现新模式)。 / p>
2。 MAIN VIEW以模态方式显示IMAGE PROCESSING VIEW,但在此之后IMAGE PROCESSING VIEW立即以模态方式呈现选择器视图,等待完成,解除选择器和用户可以看到图像处理视图与库中的图像。
示例代码:
在主视图控制器的某些操作中:
ImageProcessViewController *vc = [[ImageProcessViewController alloc] initWithNibName:@"ImageProcessViewController" bundle:nil];
vc.delegate = self;
vc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:vc animated:NO];
[vc release];
ImageProcessViewController中的:
- (void)viewDidLoad {
[super viewDidLoad];
//some UI init here
if(self.sourceType == UIImagePickerControllerSourceTypePhotoLibrary) {
UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
ipc.delegate = self;
ipc.allowsEditing = YES;
[self presentModalViewController:ipc animated:NO];
[ipc release];
}
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage* pickedImage = [info valueForKey:UIImagePickerControllerEditedImage];
self.mainImage = pickedImage;
[self dismissModalViewControllerAnimated:NO];
}
问题是,我不能在viewDidLoad方法中调用presentModalViewController,因为它不起作用(我认为它在视图控制器实时循环中太早)。我也试过viewDidAppear,但是在那种情况下我必须设置一些ivar标志,只显示一次选择器视图,并且在图像选择器视图之前显示空图像处理视图很短时间,我不希望这样。
3。 我试图弄清楚如何使用导航控制器来做到这一点,因为UIImagePickerController正在使用他的导航控制器,但这是私有结构和文档说程序员不能这样做。
请给我一些建议,因为我现在真的迷路了
答案 0 :(得分:2)
在主视图控制器中,使用viewDidAppear:animated: - 这将在模态转换完成时调用。您可以安全地从那里开始另一个模态转换。