【问题标题】:Present another modal view from UIImagePickerController从 UIImagePickerController 呈现另一个模态视图
【发布时间】:2010-09-26 21:21:26
【问题描述】:

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

我的 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 模态显示确认视图吗?如果是这样,我如何确保当确认视图被关闭时,选择器也不会显示?

编辑:

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

如果我显示模态控制器 THEN 关闭选择器,则不会发生任何事情,可能是因为两个控制器随后都被关闭了。

如果我关闭选择器 THEN 呈现模态控制器,我会收到有关模态转换的异常:

*** 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'

【问题讨论】:

    标签: iphone uiimagepickercontroller modalviewcontroller


    【解决方案1】:

    找到了解决办法。实际上,选择器需要被解除,诀窍是关闭动画以使解除立即发生,然后呈现第二个模态视图。

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

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

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

    我该怎么做??

    【讨论】:

      【解决方案2】:

      试试这个...

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

      【讨论】:

        【解决方案3】:

        您在展示它之前发布了模态。试试这个:

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

        【讨论】:

        • 我认为您还需要在呈现新的模态视图之前关闭选择器。
        • 这些建议都没有帮助。该版本只是我键入的代码中的一个错误,但它不在原始代码中。在呈现模态视图之前关闭选择器会导致异常。查看我的编辑。
        【解决方案4】:

        啊。看起来您不能以相同的方法呈现和关闭模态视图控制器。

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

        请务必将 didSelectImage 重置为 NO,并在不再需要信息字典属性时将其设置为 nil。

        【讨论】:

          【解决方案5】:

          这对我有用:

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

          也就是说,您像 A =&gt; B(modal) =&gt; C(modal) 这样呈现视图控制器,然后您从视图控制器 A 调用关闭,以便同时错过 B 和 C。

          【讨论】:

            猜你喜欢
            • 2014-12-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-24
            • 2019-11-15
            • 1970-01-01
            相关资源
            最近更新 更多