gpt4 book ai didi

arrays - 错误 : Cannot set UITableViewCell labels and images with custom cell class! 只能加载单元格样式的数据:字幕不是自定义的

转载 作者:行者123 更新时间:2023-11-28 13:44:18 25 4
gpt4 key购买 nike

过去 2 周我一直在努力让我的 iPhone 应用程序与自定义 UITableViewCell 类一起工作,并且无法在带有自定义类的 tableview 单元格中设置标签或图像。我已经能够使用标准单元格类型的字幕为每个单元格设置 textLabel 和 detailTextLabel 以及图像。

当我尝试在界面生成器中创建自定义单元格时,我转到单元格属性,选择自定义作为单元格样式,并为其指定标识符“单元格”。在代码中,我创建了一个名为 class DrinkListTableViewController: UITableViewController 的类。在同一个文件中,我创建了一个名为 class DrinkTableViewCell: UITableViewCell 的自定义单元格类,以及一个名为 struct Drink 的数据结构。我已经验证来 self 的 api 调用的数据是好的并且按预期加载但我只能使用 cell.imageView?.image = cell.textLabel?.text 设置单元格标签和图像= cell.detailTextLabel?.text = 当我真的想使用我创建的自定义单元格类时(请参阅代码作为引用)。

import Foundation
import UIKit
import Alamofire

struct Drink {
let id: String
let name: String
let description: String
let amount: Float
let image: UIImage

init(data: [String: Any]) {
self.id = data["id"] as! String
self.name = data["name"] as! String
//self.amount = data["amount"] as! Float
self.amount = ((data["amount"] as? NSNumber)?.floatValue)!
self.description = data["description"] as! String
self.image = data["image"] as! UIImage
}
}

class DrinkTableViewCell: UITableViewCell {
@IBOutlet weak var cellName: UILabel!
@IBOutlet weak var cellAmount: UILabel!
@IBOutlet weak var cellDescription: UILabel!
@IBOutlet weak var cellImage: UIImageView!

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String!) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}

class DrinkListTableViewController: UITableViewController {

var drinks: [Drink] = []

override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "Drink Selection"
tableView.dataSource = self
tableView.delegate = self
//tableView.register(DrinkTableViewCell.self, forCellReuseIdentifier: "cell")

tableView.register(DrinkTableViewCell.self as AnyClass, forCellReuseIdentifier: "cell")

//tableView.register(UINib(nibName: "DrinkTableViewCell", bundle: Bundle.main), forCellReuseIdentifier: "cell")

//tableView.estimatedRowHeight = 134
//tableView.rowHeight = UITableView.automaticDimension

fetchInventory { drinks in
guard drinks != nil else { return }
self.drinks = drinks!
//print("Data from API call: ", self.drinks)
//self.tableView.reloadData()
// DispatchQueue.main.async { [weak self] in
// self?.tableView.reloadData()
// }
}
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
DispatchQueue.main.async { [weak self] in
self?.tableView.reloadData()
}
}


override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "pizzaSegue", sender: self.drinks[indexPath.row] as Drink)
//trying another method below?
//self.navigationController?.pushViewController(UIViewController() as! PizzaViewController, animated: true)
}



override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

if segue.identifier == "pizzaSegue" {
guard let vc = segue.destination as? PizzaViewController else { return }
vc.pizza = sender as? Pizza
}
}

private func fetchInventory(completion: @escaping ([Drink]?) -> Void) {
Alamofire.request("http://127.0.0.1:4000/inventory", method: .get)
.validate()
.responseJSON { response in
guard response.result.isSuccess else { return completion(nil) }
guard let rawInventory = response.result.value as? [[String: Any]?] else { return completion(nil) }
let inventory = rawInventory.compactMap { pizzaDict -> Drink? in
var data = pizzaDict!
data["image"] = UIImage(named: pizzaDict!["image"] as! String)
//print("Printing each item: ", Drink(data: data))
//printing all inventory successful
return Drink(data: data)
}
completion(inventory)
}
}

// MARK: - Table view data source

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

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("ROWS: ", drinks.count)
return drinks.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

//let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DrinkTableViewCell

//let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell")

let cell:DrinkTableViewCell = self.tableView.dequeueReusableCell(withIdentifier: "cell") as! DrinkTableViewCell

cell.cellName?.text = drinks[indexPath.row].name
cell.cellAmount?.text = String(drinks[indexPath.row].amount)
cell.cellDescription?.text = drinks[indexPath.row].description
cell.cellImage?.image = drinks[indexPath.row].image

// cell.imageView?.image = drinks[indexPath.row].image
// cell.textLabel?.text = drinks[indexPath.row].name
// cell.detailTextLabel?.text = drinks[indexPath.row].description
//
//print(cell.textLabel?.text)
//print(cell.detailTextLabel?.text)

print(cell.cellName?.text as Any)
//print(cell.cellImage?.image)
return cell
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100.0
}

}

当使用自定义类(例如 cell.cellName?.text = drinks[indexPath.row].name)设置单元格标签和图像时,应用程序不会崩溃,但 tableView 不会加载任何内容,如在空白 tableView 中,其中 tableView 中 drinks.count 的部分数覆盖 func numberOfRowsInSection。请帮忙!

最佳答案

我认为这是因为你需要使用:

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DrinkTableViewCell

在你的代码中被注释掉了,而不是:

    let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell")

如果这不起作用,请尝试将其添加到您的自定义单元格类中,如果它不起作用,这可能就是您最初将其注释掉的原因:

 override init(style: UITableViewCell.CellStyle, reuseIdentifier: String!) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

编辑:

让我们试试不使用 Storyboard。

class PostCell: UITableViewCell {

//Declare items

let cellName = UILabel()
let cellAmount = UILabel()
let cellDescription = UILabel()
let cellImage = UIImageView()

//Setup the layouts of your items

func configureCustomCell() {

contentView.backgroundColor = .clear

contentView.addSubview(cellName)
cellName.translatesAutoresizingMaskIntoConstraints = false
cellName.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 25).isActive = true
cellName.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true

contentView.addSubview(cellAmount)
cellAmount.translatesAutoresizingMaskIntoConstraints = false
cellAmount.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 25).isActive = true
cellAmount.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true

contentView.addSubview(cellDescription)
cellDescription.translatesAutoresizingMaskIntoConstraints = false
cellDescription.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 10).isActive = true
cellDescription.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true

contentView.addSubview(cellImage)
cellImage.translatesAutoresizingMaskIntoConstraints = false
cellImage.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: -5).isActive = true
cellImage.widthAnchor.constraint(equalToConstant: 50).isActive = true
cellImage.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10).isActive = true

}

//Get ready for use

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String!) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}

然后确保你在'viewDidLoad'中有:

tableView.register(DrinkTableViewCell.self as AnyClass, forCellReuseIdentifier: "DTVCell")

然后在 'override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell' 我们应该能够做到:

let cell:UserMessagesCell = self.tableView.dequeueReusableCell(withIdentifier: "DTVCell") as! DrinkTableViewCell

并像这样使用:

cell.cellName.text = "name"

编辑:

有时单元格行高的大小会影响自定义单元格。尝试增加每行的高度以确保一切都合适,因为如果高度错误,有时您会得到空单元格。

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}

尝试使用 if 语句来避免 API 调用出现任何问题。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.drinks.count == 0 {
print("No Data Yet: ", drinks.count)
return 0
} else {
print("ROWS: ", drinks.count)
return self.drinks.count
}
}

关于arrays - 错误 : Cannot set UITableViewCell labels and images with custom cell class! 只能加载单元格样式的数据:字幕不是自定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55621833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com