如何在 prepareForSegue iOS 上设置 imageView 图像?

How to set imageView image on prepareForSegue iOS?

我尝试使用 prepareForSegue 推送到 ViewController。当我推送时,我想在推送视图控制器中的 ImageView 上设置图像。这是我尝试过的,

ViewController

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    UIButton *btn = sender;
    if (btn.tag == 50) {
        if (jpegData) {
            [self saveTempImage:jpegData];
        }
        if ([segue.identifier isEqualToString:@"HomeView"]) {
            HomeViewController *vc = [segue destinationViewController];
            vc.backImageView.image = capturedImage;
            vc.isBackImage = true;
        }
    }
}

我在 HomeViewController 中有一个 ImageView。我尝试使用此 vc.backImageView.image = capturedImage; 设置它的图像。 capturedImage 不为空。但是ImageView中没有设置图片。

我该如何解决这个问题?

提前致谢!

你的outlates还没有在那里设置,我相信此时backImageView是null。有 backImage 属性 并且当 backImageView 准备就绪时(添加到视图层次结构,viewDidLoad 是一个很好的地方)然后设置它的图像 属性.

1) 你应该将 backImageView 属性(以及 HomeViewController 的所有其他出口)设为私有,因为对于这个视图,HomeViewController 是唯一负责的,没有其他 class 应该能够操作这个观点。这是 iOS 开发中的当前既定惯例。您可以通过在 HomeViewController .m 文件中的 @implementation 关键字上方添加 class extension 来实现。

@interface HomeViewControler ()

@property (nonatomic, strong) IBOutlet UIImageView *backImageView;
//...other private properties ...

@end


@implementation MyViewControler

紧接着,您需要将视图出口属性从 .h 接口文件移动到 .m 接口扩展名以进行私有声明。

2) 您也应该在扩展中创建一个名为 capturedImage 的私有 属性。

@interface HomeViewControler ()

@property (nonatomic, strong) IBOutlet UIImageView *backImageView;
@property (nonatomic, strong) UIImage *capturedImage;

@end

3) 在h中声明一个public方法。名为 configureWithImage

的文件

-(void)configureWithImage:(UIImage *)paramImage;

并立即实施。这样的文件

-(void)configureWithImage:(UIImage *)paramImage
{
    self.capturedImage = paramImage;
}

4) 接下来您需要确保在图像视图中使用传递的图像,因为 HomeViewController 的 viewDidLoad 很有意义。

-(void)viewDidLoad
{
    [super viewDidLoad];

    self.backImageView.image = self.capturedImage;
    //...other code...
}  

5) 最后一步,在 prepareForSegue 中使用图像配置视图控制器

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIButton *btn = sender;
    if (btn.tag == 50) 
{
    //...other code...
    if ([segue.identifier isEqualToString:@"HomeView"]) 
    {
        HomeViewController *vc = [segue destinationViewController];
        [vc configureWithImage:capturedImage];

        //...other code...
    }
}

"morale of the story" 是通过拥有一个适当的 public 接口作为配置(config 方法)的唯一入口点,您可以将两个实体分离。这意味着源视图控制器仅传递图像而 不必知道目标 VC 中发生的任何事情。然后图像由负责的目标视图控制器处理。

您是否应该改变主意并在 HomeViewController 中做一些 layout/view 内容更改(可能过滤并处理图像以获得视觉效果)稍后,来源视图控制器 完全不会受到影响 因为 HomeViewController 中发生的问题与其他人无关,并且您将保持 public 配置方法完好无损。这意味着更改将不需要在 prepareForSegue 中维护代码,只需要在目标 VC 中维护代码。