Swift:如何通过didSelectRowAt传递API图片至详情ViewController
问题:Swift详情页无法加载网络植物图片
我是Swift新手,正在开发一款从API获取植物图片和信息的应用。已实现Table View展示植物名称和图片(用SDWebImage加载),点击单元格跳转至详情ViewController后,无法显示对应植物图片。图片链接格式为http://www.tropicopia.com/house-plant/thumbnails/5556.jpg,尝试用UIImage(named:)加载网络链接失败,求解决方法。
解决方法
UIImage(named:)仅能加载本地资源文件,无法处理网络图片链接。既然你已经在Table View中使用SDWebImage,直接复用它的网络图片加载能力即可,具体步骤如下:
1. 修改详情ViewController
添加图片链接接收变量,并在viewDidLoad中用SDWebImage加载图片:
import UIKit import SDWebImage class PlantDetailsViewController: UIViewController { @IBOutlet weak var plantImage: UIImageView! // 其他IBOutlet保持不变 // 添加图片链接接收变量 var plantImageUrl: String? // 原有字符串变量保持不变 override func viewDidLoad() { super.viewDidLoad() // 原有标签赋值代码保持不变 // 用SDWebImage加载网络图片 if let imageUrl = plantImageUrl, let url = URL(string: imageUrl) { // 可选:placeholderImage可替换为你的本地占位图,无占位图可移除该参数 plantImage.sd_setImage(with: url, placeholderImage: UIImage(named: "placeholder")) } } }
2. 修改Table View的didSelectRowAt方法
在跳转时传递植物图片链接:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let detail:PlantDetailsViewController = self.storyboard?.instantiateViewController(withIdentifier: "showDetails") as! PlantDetailsViewController // 原有字符串赋值代码保持不变 // 传递图片链接 detail.plantImageUrl = plants[indexPath.row].img self.navigationController?.pushViewController(detail, animated: true) }
额外优化建议
你当前通过逐个字符串变量传递植物信息的方式过于繁琐,可直接传递整个Plant对象简化代码:
- 在详情ViewController中添加
var plant: Plant? - 在
didSelectRowAt中赋值detail.plant = plants[indexPath.row] - 在详情页
viewDidLoad中直接从plant对象取值,例如:commonNameLabel.text = plant?.common_name?.first ?? "N/A"
内容的提问来源于stack exchange,提问作者andreb
相关产品推荐
相关产品推荐

