视图控制器间传图异常: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
相关产品推荐
相关产品推荐

