使用MessageKit、SDWebImage传imageURL到ViewController报nil错误如何解决
崩溃问题修复方案
根因定位
你的PhotoViewController通过Xib/Storyboard搭建,productImage是关联的IBOutlet隐式解包属性。你当前用PhotoViewController()默认初始化的方式不会加载Xib/Storyboard中的控件,导致productImage为nil,访问时触发Unexpectedly found nil崩溃。
修复步骤
1. 选择正确的初始化方式
根据你创建PhotoViewController的方式选对应初始化逻辑:
- 若用Storyboard创建:
先在Storyboard中给PhotoViewController设置Storyboard ID为PhotoViewController,再用如下代码初始化:guard let photoController = UIStoryboard(name: "你的Storyboard名称", bundle: nil).instantiateViewController(withIdentifier: "PhotoViewController") as? PhotoViewController else { return } - 若用Xib创建:
let photoController = PhotoViewController(nibName: "你的Xib文件名", bundle: nil)
2. 替换原有初始化逻辑
修改ChatDashboard中configureImageVeiwController方法里的初始化代码,替换后完整的case分支代码如下:
case .photo(let media): guard let imageURL = media.url else { return } // 替换为上面你选的正确初始化代码 guard let photoController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PhotoViewController") as? PhotoViewController else { return } photoController.imageUrL = imageURL self.navigationController?.pushViewController(photoController, animated: true)
可选优化
你可以给PhotoViewController添加自定义构造器,避免参数传错:
class PhotoViewController: UIViewController { @IBOutlet weak var productImage: UIImageView! private var imageUrL: URL? // Xib场景自定义构造器示例 init(imageUrl: URL, nibName: String? = "PhotoViewController", bundle: Bundle? = nil) { self.imageUrL = imageUrl super.init(nibName: nibName, bundle: bundle) } // Storyboard场景需要保留这个构造器 required init?(coder: NSCoder) { super.init(coder: coder) } override func viewDidLoad() { super.viewDidLoad() if let url = imageUrL { productImage.sd_setImage(with: url, completed: nil) } } }
内容的提问来源于stack exchange,提问作者Faheem
相关产品推荐
相关产品推荐

