You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

视图控制器间传图异常:PreviewController中newImage值为nil

解决PreviewController中newImage为nil的问题

我之前也碰到过一模一样的坑!这种情况大概率是图片传递的环节出了疏漏,咱们一步步排查:

1. 先确认PreviewController的属性定义是否正确

你得保证newImage属性是可修改且能正确持有图片的,举个例子:

Swift版本

// PreviewController.swift
import UIKit

class PreviewController: UIViewController {
    // 必须用var声明,要是关联了UIImageView的话记得加@IBOutlet
    var newImage: UIImage?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 先加个打印调试,看看进来的时候值是什么
        print("拿到的图片:\(newImage)")
    }
}

Objective-C版本

// PreviewController.h
@property (nonatomic, strong) UIImage *newImage;

这里一定要用strong,不然图片会被提前释放掉。

2. 检查FirstViewController里的传递逻辑

别在控制器初始化的时候就赋值,要等实例化完成后、跳转前再给newImage赋值,而且要先确认你要传递的源图片本身不是nil!

Swift跳转示例

// FirstViewController.swift
func navigateToPreview() {
    guard let previewVC = storyboard?.instantiateViewController(withIdentifier: "PreviewController") as? PreviewController else {
        print("找不到PreviewController的实例!")
        return
    }
    // 先打印源图片,确认它不是nil
    print("准备传递的源图片:\(self.sourceImage)")
    previewVC.newImage = self.sourceImage
    navigationController?.pushViewController(previewVC, animated: true)
}

Objective-C跳转示例

// FirstViewController.m
- (void)navigateToPreview {
    PreviewController *previewVC = [self.storyboard instantiateViewControllerWithIdentifier:@"PreviewController"];
    NSLog(@"准备传递的源图片:%@", self.sourceImage);
    previewVC.newImage = self.sourceImage;
    [self.navigationController pushViewController:previewVC animated:YES];
}

3. 如果用Storyboard Segue跳转,要在prepare方法里传值

要是你是通过Storyboard里的segue直接跳转的,别自己实例化控制器,要在prepare(for:sender:)里赋值:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ShowPreviewSegue" {
        let previewVC = segue.destination as! PreviewController
        previewVC.newImage = self.sourceImage
    }
}

这里要注意segue的identifier必须和Storyboard里设置的完全一致,不然会找不到对应的控制器。

4. 别在PreviewController的初始化方法里用newImage

因为属性赋值是在控制器实例化之后才完成的,要是你在init或者init?(coder:)里就去调用newImage,那肯定是nil。所有用到newImage的逻辑,都要放在viewDidLoad或者更晚的生命周期方法里。

你可以先按上面的步骤排查,重点先确认源图片本身是不是nil,再看传递过程有没有问题,应该很快就能找到原因。

内容的提问来源于stack exchange,提问作者user782400

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:50:55