当数据从一个视图控制器传递到另一个视图控制器时,我如何能够传递图像?

Posted

技术标签:

【中文标题】当数据从一个视图控制器传递到另一个视图控制器时,我如何能够传递图像?【英文标题】:How would I be able to pass an image when data is passed from one View Controller to another? 【发布时间】:2019-11-07 10:41:01 【问题描述】:

如何将图像从 HomeViewController 显示到 CartViewController

我在单元格中设置了数据从一个 VC 传递到另一个 VC 的代码,

我试图在数据传递时呈现图像

在按下 atcBtn 后数据从 HomeVC 传递到 CartVC 时,我如何显示图像

我标签中的所有数据都可以通过,只是图像数据无法通过

我从堆栈尝试了几种方法,但在 CartVC 中显示图像时仍然不断收到错误代码

class CartViewController: UIViewController 

    var items: Items!
    @IBOutlet weak var cartTableView: UITableView!

     override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        cartTableView.dataSource = self
        cartTableView.delegate = self
    



extension CartViewController: UITableViewDataSource, UITableViewDelegate 

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return Cart.currentCart.cartItems.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "CartCell", for: indexPath) as! CartCell

        let cart = Cart.currentCart.CartItems[indexPath.row]

        cell.store.text = cart.items.store
        cell.lblMealName.text = (cart.items.name)
        cell.lblSubTotal.text = "$\(cart.items.cost)"

        cell.imageUrl.image = cart.imageUrl   // can't figure out how to get this to code to work since it is an Image to String issue

        return cell

class CartCell: UITableViewCell 

    @IBOutlet weak var lblMealName: UILabel!
    @IBOutlet weak var imageUrl: UIImageView!
    @IBOutlet weak var lblSubTotal: UILabel!
    @IBOutlet weak var lblWeight: UILabel!

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    

【问题讨论】:

我没有看到您的CartCell 的代码?你有UIImageView吗?假设您已经传递了正确的 Items 并且它有 imageUrl 变量... 尝试在 HomeCell 类中将 imageUrl 数据类型从 UIImage 替换为 UIImageView @Tj3n CartCell 除了标签和图像的 IBOutlets 之外什么都没有,这就是为什么我没有将它添加到我的代码中,如果你愿意,我可以添加它,如果它有帮助,数据通过CartCell 中的标签非常好,它只是我正在努力解决的图像 那么它应该只是cell.itemImageView.sd_setImage(with: URL(string: items.imageUrl))?类似于您的HomeCell 代码,不知道是什么问题 您的HomeCell 中已经有一个configure(withItems:) 方法来在单元格中显示项目。为您的 CartCell 项目复制该方法.. 【参考方案1】:

您发布的代码不太匹配:

例如,在cellForRowAt 中,在CartViewController 中,您使用的是CartCell,但您的代码正在设置:

cell.store.text = cart.items.store

但您发布的CartCell 中没有store 标签/属性。

但是,由于您正在使用 HomeCell 类做非常相似的事情,所以只需对 CartCell 采取相同的方法。

类似的东西:

class CartCell: UITableViewCell 

    @IBOutlet weak var lblMealName: UILabel!
    @IBOutlet weak var imageUrl: UIImageView!
    @IBOutlet weak var lblSubTotal: UILabel!
    @IBOutlet weak var lblWeight: UILabel!

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    

    func configure(withItems items: Items) 
        //store.text = cart.items.store
        lblMealName.text = (items.name)
        lblSubTotal.text = "$\(items.cost)"
        imageUrl.sd_setImage(with: URL(string: items.imageUrl))
    


并改变`cell

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "CartCell", for: indexPath) as! CartCell

    let cart = Cart.currentCart.CartItems[indexPath.row]

    //cell.store.text = cart.items.store
    //cell.lblMealName.text = (cart.items.name)
    //cell.lblSubTotal.text = "$\(cart.items.cost)"

    //cell.imageUrl.image = cart.imageUrl   // can't figure out how to get this to code to work since it is an Image to String issue

    cell.configure(withItem: cart)

    return cell

【讨论】:

【参考方案2】:

这似乎是问题所在

cell.imageUrl.image = cart.imageUrl // 不知道怎么获取 这个代码可以工作,因为它是一个图像到字符串的问题

正如您所指出的,该代码实际上没有意义...如果您在购物车对象中存储一个 url(一个字符串),那么您不能将其转换为带有 cell.imageUrl 的图像。图片,对吧?

您需要将其分配给 url

cell.imageUrl = cart.imageUrl

当然,这只会将 url 传递给单元格。然后,单元格将需要一些智能来从 url 获取相关联的图像。

您的 CartCell 类的一些伪代码...

cell.store.text = cart.items.store
cell.lblMealName.text = (cart.items.name)
cell.lblSubTotal.text = "$\(cart.items.cost)"

cell.setImageUrlAndDisplayImage( cart.imageUrl )

然后是 CartCell 类中的函数

func setImageUrlAndDisplayImage( imageUrl: URL) 
    self.setImage(with: URL(string: imageUrl))

当然,如果有图像属性,您可以直接将图像分配给 CartCell 图像属性。

cell.store.text = cart.items.store
cell.lblMealName.text = (cart.items.name)
cell.lblSubTotal.text = "$\(cart.items.cost)"

cell.the_image = UIImage(with: URL(string: cart.imageUrl))

以上只是伪代码,因为我们不知道您的 Cart 类或 CartCell 类是什么样的。

【讨论】:

以上是关于当数据从一个视图控制器传递到另一个视图控制器时,我如何能够传递图像?的主要内容,如果未能解决你的问题,请参考以下文章

将 ImageData 从一个视图控制器传递到另一个视图控制器

当从一个视图控制器传递到另一个视图时,视图向上移动 x 像素

如何以编程方式将数据从表视图控制器传递到另一个控制器? [复制]

尝试使用 segue 将数据从一个视图控制器传递到另一个视图控制器

将标签数据从表视图传递到另一个视图控制器

使用推送视图控制器时如何将 Uiimage 从一个视图控制器传递到另一个视图控制器?