Swift中UIImage传值至下视图控制器:食谱图片跳转显示遇阻
解决RecipeTableView跳转ResultsView展示对应食谱图片的问题
嘿,我懂你现在的头疼事儿——单元格里明明能好好显示食谱图片,一点击跳转去ResultsViewController,就没法展示对应的图了对吧?结合你给的代码片段,我整理了几个最可能出问题的地方和解决办法:
1. 跳转时的数据源要和cell渲染逻辑保持一致
你在cellForRowAt里判断了isSearching状态,用了不同的数据源来渲染单元格,但很可能在didSelectRowAt里没做同样的判断,导致取错了对应的食谱对象。比如你在搜索状态下用的是过滤后的数组,但跳转时却从原tableViewDataSource里取数据,这肯定会对应不上!
修正后的didSelectRowAt代码可以这样写:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // 先确定当前要传递的是哪个数据源里的Recipe let selectedRecipe: Recipe if isSearching { // 这里替换成你实际的过滤后数组名称,比如filteredRecipes selectedRecipe = filteredRecipes[indexPath.item] } else { selectedRecipe = tableViewDataSource[indexPath.item] as! Recipe } // 跳转到ResultsViewController guard let resultsVC = storyboard?.instantiateViewController(withIdentifier: "ResultsViewController") as? ResultsViewController else { print("找不到对应的ResultsViewController") return } // 把选中的食谱传递过去(不管是带图片还是图片URL) resultsVC.selectedRecipe = selectedRecipe navigationController?.pushViewController(resultsVC, animated: true) }
2. 确保ResultsViewController能正确接收并展示图片
假设你是把整个Recipe对象传递过去,那ResultsViewController里得先有对应的接收属性,然后在合适的时机加载图片:
// ResultsViewController.swift // 先定义接收属性 var selectedRecipe: Recipe! // 假设你有一个用来展示图片的UIImageView @IBOutlet weak var recipeImageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() // 根据你的Recipe模型来处理图片 if let loadedImage = selectedRecipe.image { // 如果Recipe里已经存了加载好的UIImage,直接赋值 recipeImageView.image = loadedImage } else if let imageURL = selectedRecipe.imageURL { // 如果存的是图片URL,就用和cell里一样的逻辑异步加载 // 这里可以用你cell里用的网络请求代码,或者第三方库(比如Kingfisher) URLSession.shared.dataTask(with: imageURL) { data, _, error in guard let imageData = data, error == nil else { print("加载图片失败:\(error?.localizedDescription ?? "未知错误")") return } DispatchQueue.main.async { self.recipeImageView.image = UIImage(data: imageData) } }.resume() } }
小提醒:如果你的cell是异步加载网络图片的,那尽量传递图片URL而不是已加载的UIImage——因为cell复用的时候,可能图片还没加载完成就跳转了,这时候传递的UIImage会是nil。
3. 检查Storyboard的跳转配置是否正确
- 确认ResultsViewController的Storyboard ID和你代码里写的完全一致,别打错字!
- 如果是用segue跳转的话,记得在
prepare(for:sender:)里传递数据,而不是手动实例化控制器:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "ShowRecipeDetails" { // 替换成你实际的segue标识符 guard let indexPath = tableView.indexPathForSelectedRow else { return } let selectedRecipe: Recipe = isSearching ? filteredRecipes[indexPath.item] : (tableViewDataSource[indexPath.item] as! Recipe) let resultsVC = segue.destination as! ResultsViewController resultsVC.selectedRecipe = selectedRecipe } }
内容的提问来源于stack exchange,提问作者miranda
相关产品推荐
相关产品推荐

