在一个viewcontroller

时间:2018-02-27 20:43:28

标签: swift uitableview

我试图在同一个视图控制器中使用自定义单元格出列多个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
}

}

1 个答案:

答案 0 :(得分:1)

您的问题是您已使用此行声明cellUITableViewCell?类型:

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()
}