UIImagePicker 完成或取消后调用 popToRootViewControllerAnimated? (iPhone,目标 C)

Posted

技术标签:

【中文标题】UIImagePicker 完成或取消后调用 popToRootViewControllerAnimated? (iPhone,目标 C)【英文标题】:Calling popToRootViewControllerAnimated after UIImagePicker finish or cancel? (iPhone, Objective C) 【发布时间】:2009-08-19 10:01:17 【问题描述】:

我正在尝试在我的 iPhone 应用程序中实现实时摄像头功能,但遇到了麻烦。基本上,它的结构是这样的:我提供了一个 UINavigationController,用户可以在其中导航到带有表格视图和(在选择一个时)详细视图的图像。

然后他们可以点击一个按钮并用相机拍摄一张新照片。理想情况下,应该发生的是,在拍照或取消后,他们会返回到再次列出图像的导航根目录。为此,我在我的主要细节视图控制器中实现 UIImagePickerController 委托。

除了最后一点之外,所有这些都实现得很好 - 我可以访问照片等,但是当尝试返回第一个列表时 - 使用 popToRootViewControllerAnimated - 我收到 EXC_BAD_ACCESS 错误.这是相关代码的简化版本(didFinishPickingMediaWithInfo ... imagePickerControllerDidCancel 工作方式相同):

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

    // Do some image processing stuff here...

    [picker dismissModalViewControllerAnimated:YES];
    [picker release];

    [self.navigationController popToRootViewControllerAnimated:YES];    

注释掉最后一行使其工作,但随后它只是返回到带有原始照片的详细视图,而不是列表。

有人吗?

更新:我之前忽略的一个细节……事实上,流行音乐似乎在一定程度上起作用。相机选择器被关闭并返回列表。但是,那是应用程序死机的时候(选定的表格单元格仍然是蓝色的,用户之前从那里点击过)。我也尝试使用 popViewControllerAnimated 来代替,结果完全相同。

【问题讨论】:

【参考方案1】:

希望这对您来说还不算太晚。今晚我遇到了同样的问题,我用头撞了我的 MBP 大约 30 分钟,然后才开始有点创意。

我找到了两种方法来完成这项工作。两者都不是直观的,但你去吧。基本上,似乎问题可能是由于您在导航控制器上调用“pop”在“dismiss”动画完成之前造成的。

我发现如果我将关闭动画布尔值设置为“否”,那么它可以工作。

例如

[picker dismissModalViewControllerAnimated:**NO**];

另一种选择是创建一个实际调用“pop”函数的第二个方法,并使用具有短偏移量的计时器来调用它。足以让关闭动画运行。

例如

-(void)popMe 
    [self.navigationController popToRootViewControllerAnimated:YES];


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
    [picker dismissModalViewControllerAnimated:YES];
    [picker release];

    [self performSelector:@selector(popMe) withObject:nil afterDelay:0.1];   

那个时机对我有用,你可能需要调整一下。

希望有帮助!

安德鲁

【讨论】:

谢谢安德鲁!事实证明,我能够以不需要以这种方式进行解雇的方式重组我的代码,但我确实尝试过,它似乎工作得很好。我还看到过其他一些计时以类似方式发挥作用的情况(即尝试显示 UIActivityIndi​​catorView 时)。 Slatvick,如果你有一个通用的解决方案,我很乐意看到。我不是这样的黑客的粉丝,但它似乎是必要的。 - 安德鲁【参考方案2】:

您的问题是 [picker dismissModelViewController] 和 [picker release] 我相信...您不需要释放选择器,当您关闭我相信的模态视图控制器时它会为您释放(您没有正确执行从我能看到的)...或者它的引用计数为 0 并且不应该被释放,无论哪种方式我都记得做这样的事情并让它崩溃,因为我释放了选择器......我也注意到了你让选择器关闭模态视图控制器,你确定这是你想要做的吗?不是 [self dismissModalViewController] 或者您将视图推送到哪个 ViewController 上?

【讨论】:

我注释掉了选择器版本并将其更改为“selfdismissModalViewControllerAnimated”(不过,你是对的 - 我之前错了),不幸的是结果相同。最糟糕的是调试器并不是特别有用。 你确定你没有在你的代码中过度释放任何东西吗? 好收获!我遇到过同样的问题。我希望错误更好。【参考方案3】:

答案: 使用这个:[self.navigationControllerdismissModalViewControllerAnimated:YES];代码而不是 [picker dismissModalViewControllerAnimated:YES]; 现在,您可以从代码中删除这一行: [self.navigationController popToRootViewControllerAnimated:YES];

【讨论】:

我做了这个改变(以及“self dismissModalViewControllerAnimated”)。除非我删除 popToRootViewControllerAnimated 位,否则我会得到与以前相同的结果。我可以按照您的建议删除它并防止崩溃,但我的最终目标是让它回到初始列表。 好吧,我很确定如果你关闭模态视图控制器而不是选择器,你必须使用 self.navigationController,因为选择器是模态视图控制器。 PopToRootViewController 与您无关(在这种情况下),因为那是导航“返回”,但您只想关闭 modal-view-controller(在导航控制器中有两种导航方式)。注释掉所有的代码行,你是否又得到了那个错误(我猜),因为这个错误不是特定于这段代码的。

以上是关于UIImagePicker 完成或取消后调用 popToRootViewControllerAnimated? (iPhone,目标 C)的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePicker 选择后崩溃

如何放弃或取消 std::thread

取消所有未完成的 QTimer 事件

使用 UIImagePicker 拾取图像后重新加载 UICollectionView 的正确时间和位置

从uiimagepicker捕获图像后如何自定义图像

取消订阅 Rxjs finalize 操作符