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

iOS Core Data账单图片关联显示功能问题求助

解决选中账单对应照片显示问题

问题核心是当前查看页面未接收选中的账单数据,而是固定读取第0条数据的照片,按以下步骤修改即可实现对应账单照片展示:

1. 给查看页面添加选中账单属性

修改ViewControllerViewing,新增属性接收从列表页传递的选中账单对象,替代全量拉取数据的方式:

import UIKit
import CoreData

class ViewControllerViewing: UIViewController {
    // 新增属性:接收选中的账单对象
    var selectedBravo: Bravo?
    
    @IBOutlet weak var imgDisplay: UIImageView!
    @IBOutlet weak var lblBill: UILabel!
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    override func viewDidLoad() {
        super.viewDidLoad()
        // 页面加载时直接显示选中账单的照片(可选,也可保留按钮触发逻辑)
        if let bravo = selectedBravo, let photoData = bravo.photo {
            imgDisplay.image = UIImage(data: photoData)
            lblBill.text = bravo.provider // 同步显示账单名称
        }
    }
    
    @IBAction func btnDisplay(_ sender: Any) {
        // 直接使用传入的选中账单数据展示照片
        if let bravo = selectedBravo, let photoData = bravo.photo {
            imgDisplay.image = UIImage(data: photoData)
        }
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
       self.view.endEditing(true)
   }
}

2. 列表页面传递选中账单到查看页面

修改CarViewController的didSelectRowAt方法,添加跳转逻辑并传递选中的账单对象(假设使用Storyboard Segue跳转,Segue标识符设为showBillPhoto):

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let selectedBravo = self.bills[indexPath.row]
    
    // 保留原有编辑逻辑,新增查看照片的选项
    let alert = UIAlertController(title: "操作账单", message: "选择要执行的操作", preferredStyle: .alert)
    alert.addTextField()
    let txtProvider = alert.textFields![0]
    txtProvider.text = selectedBravo.provider // 填充当前账单名称到输入框
    
    // 保存编辑的按钮
    let saveButton = UIAlertAction(title: "保存修改", style: .default) { [weak self] (action) in
        guard let self = self else { return }
        selectedBravo.provider = txtProvider.text
        do {
            try self.context.save()
            self.fetchBravo()
            // 编辑完成后跳转查看照片
            self.performSegue(withIdentifier: "showBillPhoto", sender: selectedBravo)
        } catch {
            print("保存失败: \(error)")
        }
    }
    
    // 直接查看照片的按钮
    let viewPhotoButton = UIAlertAction(title: "查看照片", style: .default) { [weak self] (action) in
        guard let self = self else { return }
        self.performSegue(withIdentifier: "showBillPhoto", sender: selectedBravo)
    }
    
    alert.addAction(saveButton)
    alert.addAction(viewPhotoButton)
    alert.addAction(UIAlertAction(title: "取消", style: .cancel))
    
    self.present(alert, animated: true, completion: nil)
}

// 重写prepare方法传递选中的账单数据
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showBillPhoto", 
       let destinationVC = segue.destination as? ViewControllerViewing, 
       let selectedBravo = sender as? Bravo {
        destinationVC.selectedBravo = selectedBravo
    }
}

3. 清理冗余代码

删除ViewControllerViewing中的fetchImage方法和selectedImage属性,不再需要全量拉取数据。

修改完成后,用户选中任意账单,查看页面都会展示对应的账单照片。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:19:47