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

无Storyboard/segue时ViewController传数据失败,图片加载返回nil

问题分析与解决

你遇到的核心问题非常典型——你传递数据的ViewController实例和你实际push的不是同一个对象,这直接导致详情页拿不到正确的餐厅数据。

错误代码的问题点

看你这段跳转代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let detailView: DetailViewController = DetailViewController() 
    detailView.restaurant = restaurants[indexPath.row] 
    self.navigationController?.pushViewController(DetailViewController(), animated: false) 
}

你先创建了detailView实例,并且给它的restaurant属性赋值了选中的餐厅数据,但最后push到导航栈的是全新创建的DetailViewController()实例,这个新实例的restaurant是默认初始化的空对象,自然拿不到正确的图片名称。

修正后的代码

只需要把push的参数改成你已经赋值好的detailView即可:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let detailView = DetailViewController() 
    detailView.restaurant = restaurants[indexPath.row] 
    self.navigationController?.pushViewController(detailView, animated: false) 
}

额外检查点(防止其他潜在问题)

  1. Restaurant类的初始化:确保你的Restaurant类的初始化方法正确存储了image参数,比如:
class Restaurant {
    var name: String
    var image: String
    var isVisited: Bool
    
    init(name: String, image: String, isVisited: Bool) {
        self.name = name
        self.image = image
        self.isVisited = isVisited
    }
}

如果是用结构体,默认的成员初始化器也能正常工作,但如果是类,必须确保自定义初始化方法正确赋值所有属性。

  1. 图片文件的正确性:确认你的图片文件(比如cafedeadend.jpg)确实已经添加到项目中,并且文件名的大小写和你代码里的完全一致(iOS的文件系统是区分大小写的,比如CafeDeadend.jpg和cafedeadend.jpg会被视为不同文件)。

  2. DetailViewController的属性声明:确保你在详情页的属性声明是可变的,并且初始化合理:

var restaurant: Restaurant! // 或者用可选类型,确保赋值后再使用

如果用var restaurant = Restaurant(),需要确保Restaurant有默认的空初始化方法,否则会编译报错;更推荐用隐式解包可选类型!或者可选类型?,避免默认初始化带来的空数据问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:32:55