如何显示从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]()
}
例如,在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 }