从UIImagePickerController呈现另一个模态视图

时间:2010-09-26 21:21:27

标签: iphone uiimagepickercontroller modalviewcontroller

我想在用户拍照或选择已保存的照片后添加确认视图。确认视图将仅显示所选图像,并在工具栏中显示取消和上传按钮。

我的UIImagePickerController是从我的一个视图控制器以模态方式呈现的,它由导航控制器控制,导航控制器又由标签栏控制器控制。

如何以模态方式显示我的确认视图,以便在用户选择照片时占据整个屏幕(如图像选择器视图)?理想情况下,我想要这样的事情:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker dismissModalViewControllerAnimated:YES];
    UIViewController *modal = [[UIViewController alloc] init];
    modal.view = confirmationView;
    [self presentModalViewController:modal animated:YES];
    [modal release];
}

但是,这会导致应用崩溃。我应该从PICKER以模态方式呈现确认视图吗?如果是这样,我如何确保在取消确认视图时,也不会显示选择器?

编辑:

修正了我发布的代码中的错误。当我尝试从内存而不是复制+粘贴中输入时会发生这种情况:(无论如何,到目前为止的建议并没有帮助。

如果我提出模态控制器然后解雇选择器,则没有任何反应,大概是因为两个控制器随后都被解雇了。

如果我解雇拾取器然后呈现模态控制器,我得到关于模态转换的例外:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from <UINavigationController: 0x6b33940> to <UIViewController: 0x6b62b00> while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'

5 个答案:

答案 0 :(得分:3)

找到解决方案。实际上,拾取器需要被解雇,并且诀窍是关闭动画以解除该解雇,以便立即发生,然后呈现第二个模态视图。

编辑:实际上,它让我几乎达到我想要的水平。当你关闭选择器时,原始视图会瞬间显示,然后模态视图会被动画化。这看起来有点时髦。

我也试图保持选择器而不是解雇它。相反,我打电话给[picker presentModalViewController:modal animated:YES]。这让我可以顺利地从选择器转换到确认视图。但是,当我完成确认视图时,我需要从原始控制器调用[self dismissModalViewControllerAnimated:YES]。这具有在解除所有内容之前首先显示图像选择器的效果。再一次,不是我想要的。

理想情况下,我想要与Facebook iPhone应用程序用于上传照片的效果相同。选择照片后,它会无缝转换为确认视图。从该视图中取消或确认将平滑过渡回原始主视图。这看起来像确认视图是图像选择器的一部分,当它可能只是另一个自定义视图时。

我该怎么做?

答案 1 :(得分:1)

试试这个......

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIViewController *modal = [[UIViewController alloc] init];
    modal.view = confirmationView;
    picker.navigationController pushViewController:modal animated:YES];
    [modal release];
}

答案 2 :(得分:0)

你在发表之前发布模态。试试这个:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIViewController *modal = [[UIViewController alloc] init];
    modal.view = confirmationView;
    [self presentModalViewController:modal animated:YES];
    [modal release];
    [picker dismissModalViewControllerAnimated:YES];
}

答案 3 :(得分:0)

阿。看起来您无法在同一方法中呈现和关闭模态视图控制器。

您可以使用属性(帮助内存管理)来存储信息字典,使用ivar来存储类似“didSelectImage”的内容。然后在视图控制器的viewDidAppear中,如果didSelectImage == YES,则使用信息字典中的详细信息以模态方式显示视图控制器。

确保将didSelectImage重置为NO,并在不再需要时将信息字典属性设置为nil。

答案 4 :(得分:0)

这对我有用:

[myViewControllerA presentModalViewController:myViewControllerB];
//... let myViewControllerB do its job
[myViewControllerB presentModalViewController:myViewControllerC];
//... let myViewControllerC do its job
[myViewControllerA dismissModalViewControllerAnimated:YES];

也就是说,您呈现像A => B(modal) => C(modal)这样的视图控制器,然后从视图控制器A调用di​​smiss,以便同时错过B和C.