我试图在同一个视图控制器中使用自定义单元格出列多个tableviews我一直收到错误(类型的值' UITableViewCell?'没有成员' serviceChoiceAmount',& #39; serviceChoicePrice',' serviceChoiceTitle',' serviceChoiceImage')下面我有视图控制器的代码和一个自定义单元格(其他人会出现相同的错误)。 (我没有输入其他单元格的所有代码,如果我有这个错误的解决方案,我会这样做),我应该为自定义单元格类中的单元格创建初始化程序并使用视图控制器内部的单元格出列? / p>
查看控制器
import UIKit
class CartViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
let defaults = UserDefaults.standard
var TOTAL = [Double]()
@IBOutlet weak var cartTableView: UITableView!
@IBOutlet weak var totalTableView: UITableView!
@IBOutlet weak var optionsTableView: UITableView!
@IBOutlet weak var choosePayment: UITableViewCell!
@IBOutlet var address: [UITableViewCell]!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let Cartcell = defaults.array(forKey: "Cart")
print(Cartcell as Any)
print(TOTAL)
print("ViewDidLoad")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func clearCart(_ sender: Any) {
//add function to clear total cell
CartSingleton1.sharedInstance.orderDict.removeAll()
cartTableView.reloadData()
}
func numberOfSections(in tableView: UITableView) -> Int {
var section: Int?
if tableView == self.cartTableView{
section = 1
}
if tableView == self.totalTableView{
section = 1
}
if tableView == self.optionsTableView{
section = 3
}
return section!
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
var title: String?
if tableView == self.cartTableView{
title = ("Order Details")
}
if tableView == self.totalTableView{
title = ("Total")
}
if tableView == self.optionsTableView{
title = ("Payment Option")
//dropoff address
//pickup address
}
return title!
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
var count: Int?
if tableView == self.cartTableView{
count = CartSingleton1.sharedInstance.orderDict.count
}
if tableView == self.totalTableView{
count = 1
}
if tableView == self.optionsTableView{
count = 3
}
return count!
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell: UITableViewCell?
if tableView == self.cartTableView{
let cart = CartSingleton1.sharedInstance.orderDict[indexPath.row] as NSDictionary
cell = tableView.dequeueReusableCell(withIdentifier: "ServiceCart") as! CartTableViewCell
cell.serviceChoiceImage.image = cart.value(forKey: "image") as? UIImage
cell.serviceChoicePrice.text = cart.value(forKey: "pricing") as? String
cell.serviceChoiceTitle.text = cart.value(forKey: "titled") as? String
let quantityInt = cart.value(forKey: "quantity") as? Int
cell.serviceChoiceAmount.text = quantityInt?.description
}
if tableView == self.totalTableView{
}
if tableView == self.optionsTableView{
}
return cell!
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if tableView == self.cartTableView{
if editingStyle == .delete{
print("deleted")
CartSingleton1.sharedInstance.orderDict.remove(at: indexPath.row)
self.cartTableView.deleteRows(at: [indexPath], with: .automatic)
print("cart dictionary delete", CartSingleton1.sharedInstance.orderDict)
}
}
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
自定义单元格:CartTableViewCell
import UIKit
class CartTableViewCell: UITableViewCell {
@IBOutlet weak var serviceChoiceImage: UIImageView!
@IBOutlet weak var serviceChoiceTitle: UILabel!
@IBOutlet weak var serviceChoiceAmount:UILabel!
@IBOutlet weak var serviceChoicePrice: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
答案 0 :(得分:1)
您的问题是您已使用此行声明cell
为UITableViewCell?
类型:
var cell: UITableViewCell?
因此,当您将单元格出列并将其分配给此变量时,它会假定该类型。因此即使它真的是CartTableViewCell
,Swift也只允许您调用方法并访问UITableViewCell
可用的属性。
删除该声明并将dequeue
行更改为:
let cell = tableView.dequeueReusableCell(withIdentifier: "ServiceCart") as! CartTableViewCell
cell
将为CartTableViewCell
类型,您可以访问其属性。由于cell
不再是可选的,请更改您的:
return cell!
为:
return cell
您需要将此return
移至if
块中,或将cell
指定给另一个变量以在函数末尾返回。
或者,将cell
更改为tableCell
并仅将其用于返回单元格值:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var tableCell: UITableViewCell?
if tableView == self.cartTableView {
let cart = CartSingleton1.sharedInstance.orderDict[indexPath.row] as NSDictionary
let cell = tableView.dequeueReusableCell(withIdentifier: "ServiceCart") as! CartTableViewCell
cell.serviceChoiceImage.image = cart.value(forKey: "image") as? UIImage
cell.serviceChoicePrice.text = cart.value(forKey: "pricing") as? String
cell.serviceChoiceTitle.text = cart.value(forKey: "titled") as? String
let quantityInt = cart.value(forKey: "quantity") as? Int
cell.serviceChoiceAmount.text = quantityInt?.description
tableCell = cell
}
if tableView == self.totalTableView {
}
if tableView == self.optionsTableView {
}
// safely unwrap tableCell and return UITableViewCell() if nothing was assigned
return tableCell ?? UITableViewCell()
}