一个带有自定义原型单元的UIViewController中的两个UITableView会出错

时间:2017-05-30 18:31:35

标签: swift uitableview uiviewcontroller swift3

我正在学习swift,我正在尝试构建一个用于记录锻炼的应用程序。

我正在使用不同的视图和原型单元格,它完美无缺。

但现在在一个视图中我有两个tableview,每个都有相同类型的原型单元格,也是一个自定义单元格:

Container

它只有一个ID和一个标签。我在另一个tableview中使用它,它的工作非常完美。

我在stackoverflow上找到了如何在一个View中使用多个UITableViews,它向我展示了与标准单元格完美匹配的数据。

但是,只要我在故事板中添加标识符,并在代码中建立插座连接并使用这些标识符,我就会收到错误。

快速信息,我试过这一行:

import UIKit

class muscleCell: UITableViewCell {
    @IBOutlet weak var lblDescription: UILabel!
    var id : Int64?

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

也是这样的(因为我发现它可能会有所帮助):

self.lvMainMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "mainMuscleCell")

但也没有用。

self.lvMainMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")

我得到的错误是:

  

无法将“UITableViewCell”类型的值(0x10a63c778)转换为   'WorkoutPartner.muscleCell'(0x107b422f0)。   在这一行:

import UIKit

class MachineController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var txtName: UITextField!
    @IBOutlet weak var txtType: UITextField!
    @IBOutlet weak var deleteToolbar: UIToolbar!
    @IBOutlet weak var btnDelete: UIBarButtonItem!

    @IBOutlet weak var lvMainMuscles: UITableView!
    @IBOutlet weak var lvSupportingMuscles: UITableView!

    var machineId: Int64?
    var objMachine = Machine(connection: wpdb().db!)

    var objMuscle = Muscle(connection: wpdb().db!)
    var mainMuscleData : Array<Muscle.structMuscleList> = []
    var supportingMuscleData : Array<Muscle.structMuscleList> = []

    override func viewDidLoad() {
        super.viewDidLoad()
        if (machineId != nil) {
            if (objMachine.loadById(Id: machineId!) == true) {
                self.title = objMachine.name
                txtName.text = objMachine.name
                txtType.text = String(objMachine.typeId)
            }
        } else {
            deleteToolbar.isHidden = true
        }

        lvMainMuscles.delegate = self
        lvMainMuscles.dataSource = self
        lvMainMuscles.allowsMultipleSelection = true
        self.lvMainMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "mainMuscleCell")

        lvSupportingMuscles.delegate = self
        lvSupportingMuscles.dataSource = self
        lvSupportingMuscles.allowsMultipleSelection = true

        self.lvSupportingMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "supportingMuscleCell")

        getData()
        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    @IBAction func btnSaveClick(_ sender: Any) {

        objMachine.name = txtName.text!
        objMachine.isSystem = false
        objMachine.typeId = Int64(txtType.text!)!

        let returnId = objMachine.save()
        print("edited/saved id: \(returnId)")

        let selectedrows = lvMainMuscles.indexPathsForSelectedRows

        if (selectedrows?.count)! > 0 {
            for row in selectedrows! {
                print(row.row)
            }
        }
        _ = self.navigationController?.popViewController(animated: true)

    }

    @IBAction func btnDeleteClick(_ sender: Any) {

        let alert = UIAlertController(title: title, message: "Do you really want to delete the machine?", preferredStyle: UIAlertControllerStyle.alert)
        let okAction = UIAlertAction(title: "Delete", style: .default, handler: { action in
            if self.objMachine.delete() == true {
                _ = self.navigationController?.popViewController(animated: true)

            }
        })
        let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: nil)

        alert.addAction(cancelAction)
        alert.addAction(okAction)
        self.present(alert, animated: true, completion: nil)
    }


    func getData() {
        mainMuscleData = objMuscle.getList()
        supportingMuscleData = objMuscle.getList()
        //  searchTextField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if tableView == self.lvMainMuscles {
            return mainMuscleData.count
        } else {
            return supportingMuscleData.count
        }
    }

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

        var cell:muscleCell!

        if tableView == self.lvMainMuscles {
            cell = tableView.dequeueReusableCell(withIdentifier: "mainMuscleCell") as! muscleCell
            cell.lblDescription.text = mainMuscleData[indexPath.row].description
        }

        if tableView == self.lvSupportingMuscles {
            cell = tableView.dequeueReusableCell(withIdentifier: "supportingMuscleCell") as! muscleCell
            cell.lblDescription.text = supportingMuscleData[indexPath.row].description
        }
        return cell
    }


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       // tableView.deselectRow(at: indexPath as IndexPath, animated: true)
        if tableView == lvMainMuscles {
            let cell = self.lvMainMuscles.cellForRow(at: indexPath)!
            cell.accessoryType = UITableViewCellAccessoryType.checkmark;
        } else {
            let cell = self.lvSupportingMuscles.cellForRow(at: indexPath)!
            cell.accessoryType = UITableViewCellAccessoryType.checkmark;
        }
    }

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        if tableView == lvMainMuscles {
            let cell = self.lvMainMuscles.cellForRow(at: indexPath)!
            cell.accessoryType = UITableViewCellAccessoryType.none;
        } else {
            let cell = self.lvSupportingMuscles.cellForRow(at: indexPath)!
            cell.accessoryType = UITableViewCellAccessoryType.none;
        }
    }

我不明白为什么,因为我在另一个视图中使用相同的单元格并且它有效。

我希望你有个主意,

非常感谢

JYB

3 个答案:

答案 0 :(得分:0)

您已经为UITableView注册了UITableViewCell.self,因此,它正在返回它。请尝试注册自定义单元格类。

答案 1 :(得分:0)

从您的问题和代码中我理解的是,这两个表对同一UIView中的单元格具有相同的设计。

在这种情况下,无论何时重复使用单元格设计,我们都应该创建自定义表格单元格的XIB,使用表格注册 NIB ,然后在cellForRow < / p>

这是我为你制作的快速Sample

这是控制器代码部分:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var firstTable: UITableView!
    @IBOutlet weak var secondTable: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()

        firstTable.dataSource = self
        firstTable.delegate = self
        secondTable.dataSource = self
        secondTable.delegate = self

        //Registering Cell with tables
        self.firstTable.register(UINib(nibName: "MuscleTableCell", bundle: nil), forCellReuseIdentifier: "MuscleTableCell")
        self.secondTable.register(UINib(nibName: "MuscleTableCell", bundle: nil), forCellReuseIdentifier: "MuscleTableCell")

    }

}

extension ViewController : UITableViewDataSource, UITableViewDelegate {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if tableView == self.firstTable {
            return 5
        } else {
            return 2
        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if tableView == self.firstTable {
            let cell = tableView.dequeueReusableCell(withIdentifier: "MuscleTableCell") as! MuscleTableCell
            cell.descriptionLabel.text = "Muscle Table Cell"
            return cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "MuscleTableCell") as! MuscleTableCell
            cell.descriptionLabel.text = "Supporting Table Cell"
            return cell
        }
    }
}

CustomCellClass

import UIKit

class MuscleTableCell: UITableViewCell {

    @IBOutlet weak var descriptionLabel: 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
    }
}

Custom Cell也有它的nib文件。enter image description here

输出enter image description here

答案 2 :(得分:0)

如果有人遇到同样的问题,请确定:

我通过删除这两行代码来解决它:

self.lvMainMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "mainMuscleCell")

self.lvSupportingMuscles.register(UITableViewCell.self, forCellReuseIdentifier: "supportingMuscleCell")

我认为我的错误是,虽然我在故事板中有一个原型单元,但我已经注册了单元格。