当数据从一个View Controller传递到另一个View Controller时如何传递图像?

问题描述 投票:-3回答:1

如何显示从HomeViewController到CartViewController的图像

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

我正在尝试在传递数据时显示图像

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

我标签中的所有数据都可以通过,仅通过失败的图像数据就可以通过

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

class Items {
    var id: String
    var name: String
    var store: String
    var cost: String
    var imageUrl: String

    init(id: String,
         name: String,
         store: String,
         cost: String,
         descriptionLbl: String) {

        self.id = id
        self.name = name
        self.store = store
        self.cost = cost
        self.imageUrl = imageUrl   
    }

    convenience init(dictionary: [String : Any]) {
        let id = dictionary["id"] as? String ?? ""
        let name = dictionary["name"] as? String ?? ""
        let store = dictionary["store"] as? String ?? ""
        let cost = dictionary["cost"] as? String ?? ""
        let imageUrl =  dictionary["imageUrl"] as? String ?? ""

        self.init(id: id,
                  name: name,
                  store: store,
                  cost: cost,
                  imageUrl: imageUrl)
    }

}

import UIKit
import SDWebImage
import Firebase


class HomeCell: UITableViewCell {

    weak var items: Items!
    var addActionHandler: (() -> Void)?

    @IBOutlet weak var name: UILabel!
    @IBOutlet weak vat imageUrl: UIImage!
    @IBOutlet weak var store: UILabel!
    @IBOutlet weak var cost: UILabel!

    @IBOutlet weak var addToCart: RoundButton!

    func configure(withItems items: Items) {
        name.text = items.name
        store.text = items.store
        cost.text = items.cost
        image.sd_setImage(with: URL(string: items.imageUrl))
    }

    @IBAction func atcBtn(_ sender: UIButton) {
        self.addActionHandler?()
    }   
}

import UIKit
import Firebase
import FirebaseFirestore

class HomeViewController: UITableViewController {

    @IBOutlet weak var cartButton: BarButtonItem!!
    @IBOutlet weak var tableView: UITableView!

    var itemSetup: [Items] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self

        fetchItems { (items) in
            self.itemSetup = items.sorted
            self.tableView.reloadData()
        }

    }
    func fetchItems(_ completion: @escaping ([Items]) -> Void) {
        let ref = Firestore.firestore().collection("items")
        ref.addSnapshotListener { (snapshot, error) in
            guard error == nil, let snapshot = snapshot, !snapshot.isEmpty else {
                return
            }
            completion(snapshot.documents.compactMap( {Items(dictionary: $0.data())} ))
        }
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return itemSetup.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "HomeCell") as? HomeCell else { return UITableViewCell() }

        let item = itemSetup[indexPath.row]
        cell.configure(withItem: item)
        cell.addActionHandler = {
             Cart.currentCart.items.append(item)
        }
        cell.delegate = self
        return cell
    }

}

class TestCartViewController: 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
    }
}


class Cart {
    static let currentCart = Cart()
    var cartItems = [Items]()
}
ios swift firebase uitableview sdwebimage
1个回答
0
投票
您发布的代码不太匹配:

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

cell.store.text = cart.items.store

但是您发布的store中没有CartCell标签/媒体资源。

但是,由于您对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 }

© www.soinside.com 2019 - 2024. All rights reserved.