【问题标题】:Parent View issues with UIImagePickerControllerSourceTypeCameraUIImagePickerControllerSourceTypeCamera 的父视图问题
【发布时间】:2026-01-19 06:25:01
【问题描述】:

我对 UIImagePickerControllerSourceTypeCamera 有一个奇怪的问题。我的应用程序提供了从图库中选择图片或使用相机拍照的选项。如果我选择画廊,我会选择一张照片并返回我的视图,没有问题。

但是,当使用 UIImagePickerControllerSourceTypeCamera 时,当我返回它时,它似乎对我的视图做了一些奇怪的事情。

例如,我在 viewDidLoad 方法中有一堆代码,如果它需要基于某些因素移动视图中的一些对象 - 此代码在我退出 UIImagePickerControllerSourceTypeCamera 时被调用,但在我退出时不会被调用画廊。

这是预期的吗?

【问题讨论】:

    标签: iphone camera uiimagepickercontroller


    【解决方案1】:

    我认为你的观点被 didReceiveMemoryWarning 东西所抛弃,这是由资源密集型相机的东西触发的。你可以强制模拟器在没有摄像头的情况下产生内存警告来验证这个理论。

    一般来说,viewDidLoad 需要能够处理多次调用。这不是init 方法。如果 self.view 设置为 nil 并且稍后需要重新创建视图,它会再次调用。可能有一个更合适的位置来放置导致问题的任何代码,但是 init 方法很棘手,因为指定的初始化程序会被 nib 加载绕过。

    当从 nib 加载时,会调用类的 initWithCoder,而这会绕过整个初始化过程,因为假定去归档是在吸入已经初始化的对象。因此,重新初始化对象可能会破坏一些东西,比如调用 loadView ,它本质上与 nib 包含的内容冲突,因为它应该以编程方式构造 nib 中已有的内容。您仍然可以像往常一样覆盖 initWithCoder,只要您按照应有的方式将 args 传递给 super,但是如果您使用指定的初始化程序初始化对象,则不会调用它。当然,如果您需要担心,您可以将要在两者中执行的所有代码放入一个方法中,该方法可以从两个重写的方法中调用。

    【讨论】:

    • 谢谢,这有助于我理解一点。内存警告没有影响我的视图或应用程序。很奇怪,好像view就在那里,但是感觉返回的时候需要运行viewDidLoad和viewWillAppear方法
    • 我也刚刚注意到,由于我的视图是导航视图的一部分,它会弄乱堆栈。如果我从相机弄乱的视图返回到根视图,那么我的根视图就会有另一个返回按钮返回到无处...似乎完全精神。然后我的堆栈完全混乱和疯狂,只有重新启动应用程序才能解决它。为了帮助人们理解,我有一个根视图控制器,它创建一个 newView 控制器并将其拉入视图。然后使用相机。
    • 重启手机解决了这个问题... ?!?!