【问题标题】:Passing UIImage between ViewControllers在 ViewController 之间传递 UIImage
【发布时间】:2023-03-22 17:32:02
【问题描述】:

在我的第一个视图控制器中,我有一个在实现文件中合成的 UIImage 属性。在推送的第二个视图控制器中,我在那里创建了一个 UIImage 对象,同时将它设置为第一个视图控制器的 UIImage 属性。最后,我解散了第二个视图控制器。但是,在关闭视图控制器后,图像似乎没有保存。我的理解是,由于 UIImage 是一个指针,因此数据传递是通过引用进行的,并且由于控制器被解除,所以 UIImage 也是如此。这是正确的,有没有更好的方法来完成这项任务?供您参考,我使用的是 ARC。

在第一个视图控制器(firstVC)中,

@property (strong, nonatomic) UIImage *image;

在第二个视图控制器中,

[firstVC setImage:self.ivarUIImageView.image];

其中 ivarUIImageVIew 定义为:

@property (strong, nonatomic) IBOutlet UIImageView *ivarUIImageView;

现在让我们在第三个视图控制器中说,我在 viewDidLoad 方法中:

imgView = [[UIImageView alloc] initWithImage:firstVC.image];

其中imgView定义为:

@property (strong, nonatomic) IBOutlet UIImageView *imgView;

【问题讨论】:

  • 在你的第三个VC中,你如何定义firstVC?如果你记录 firstVC(在第三个 VC 的 viewDidLoad 中),它是 nil 吗?
  • 如果你只是想处理同一张图片,为什么不把它放在一个单例类中(例如AppDelegate)?
  • 你在这里做什么真的不清楚。在第二个视图控制器中,您在 firstVC 上调用 setImage —— firstVC 是什么?指向第一个视图控制器的指针?图像视图?在第三个视图控制器中,你说你有一个 IBOutlet imgView,但是你分配初始化它——如果它是 IB 中图像视图的出口,你不想这样做。
  • @rdelmar 很抱歉。 firstVC 实际上是指向第一个视图控制器的指针。事实证明图像没有显示,因为我在它是一个出口时分配并初始化它。所以如果我已经通过 IB 实现了,就不需要分配和初始化了吗?另外,Obj-C 是否通过引用/指针传递 UIImage?
  • 是的,您不想分配初始化一个您在 IB 中有出口的对象——这会创建一个不同的实例,这不是您想要的。是的,对象是通过引用传递的。

标签: ios objective-c ios6 uiimage


【解决方案1】:

您希望通过设置属性strong 来确保UIImage 被第一个视图控制器保留。此外,如果在 UIImageView 中显示它,您必须将 UIImageView 的 image 设置为新图像才能看到 UI 中反映的变化。

【讨论】:

  • 第一个视图控制器中的 UIImage 具有强属性和非原子属性集。在第二个视图控制器中创建了一个图像,我使用了适当的 setter 方法来设置 UIImage。当尝试在 UIImageView 中显示图像时,我首先使用 UIImage 属性分配和 initWithImage。但是什么都没有显示。我哪里做错了?
  • 你能显示那个代码吗?您要确保将 UIImageView 添加到视图中,并且执行 setImage: 在第二个视图重新设置第一个图像之后。这可以通过覆盖视图控制器的 setImage: 访问器方法来完成。
  • Objective-C 是否通过引用传递 UIImage?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 2017-01-22
  • 2019-12-05
相关资源
最近更新 更多