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

时间:2009-08-19 10:01:17

标签: objective-c iphone-sdk-3.0 uinavigationcontroller camera uiimagepickercontroller

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

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

所有这一切都很好地实现,除了最后一点 - 我可以访问照片等,但在尝试返回到第一个列表时 - 使用 popToRootViewControllerAnimated - 我得到{{1}错误。以下是相关代码的简化版本( 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]; } 代替完全相同的结果。

3 个答案:

答案 0 :(得分:4)

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

我找到了两种方法来完成这项工作。两者都不直观,但你走了。基本上,似乎可能的问题可能是由于您在“dismiss”动画完成之前在navigationController 上调用“pop”这一事实。

我发现如果我将dismiss上的动画布尔值设置为“NO”,那么它就可以了。

E.g。

[picker dismissModalViewControllerAnimated:**NO**];

另一个选择是创建一个实际调用“pop”函数的第二个方法,并使用一个带有短偏移的计时器来调用它。足以让人们放弃动画。

E.g。

-(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];   
}

这个时间适合我,你可能需要调整。

希望有所帮助!

  • 安德鲁

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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