无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) }
额外检查点(防止其他潜在问题)
- 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 } }
如果是用结构体,默认的成员初始化器也能正常工作,但如果是类,必须确保自定义初始化方法正确赋值所有属性。
图片文件的正确性:确认你的图片文件(比如
cafedeadend.jpg)确实已经添加到项目中,并且文件名的大小写和你代码里的完全一致(iOS的文件系统是区分大小写的,比如CafeDeadend.jpg和cafedeadend.jpg会被视为不同文件)。DetailViewController的属性声明:确保你在详情页的属性声明是可变的,并且初始化合理:
var restaurant: Restaurant! // 或者用可选类型,确保赋值后再使用
如果用var restaurant = Restaurant(),需要确保Restaurant有默认的空初始化方法,否则会编译报错;更推荐用隐式解包可选类型!或者可选类型?,避免默认初始化带来的空数据问题。
内容的提问来源于stack exchange,提问作者multiverse
相关产品推荐
相关产品推荐

