斯威夫特 - 无法施展UITableViewCell'

时间:2018-01-05 22:04:42

标签: ios swift uitableview

我正在尝试创建一个包含图像和标签的非常简单的表格视图。我试图自定义/样式每个单元格的内部(编程),因此我创建了一个名为" BarCell"为了编程每个单元格的外观。但是,当我尝试遵循此格式时,我收到以下错误:

Could not cast value of type 'UITableViewCell' (0x10bda7038) to 'ProjectName.BarCell' (0x105332c38).

这个错误是什么意思?我已经将我的BarCell类声明为一种UITableViewCell。因此,我怎么得到这个错误?非常新的快速,所以任何提示可以指出我正确的方向将是非常有帮助的。这是我的完整代码

//
//  HomeController.swift
//  Covered
//
//  Created by name on 1/3/18.
//  Copyright © 2018 name. All rights reserved.
//

import UIKit
import Firebase

class HomeController: UIViewController, UITableViewDelegate, UITableViewDataSource{

    let bars = ["one", "two", "three"]

    let tableView: UITableView = {
        let tv = UITableView()
        tv.separatorStyle = .none
        tv.allowsSelection = true
        return tv
    }()

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return bars.count
    }

    var barImage: UIImage?
    var barCover: String?

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

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


        cell.imageView?.image = UIImage(named: bars[indexPath.row])
        cell.textLabel?.text = bars[indexPath.item]

        barImage = cell.imageView?.image
        barCover = cell.textLabel?.text
        return cell
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 160
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        setUpNavigationBar()
        setUpTableView()

        //user is not logged in

        if Auth.auth().currentUser?.uid == nil {
            perform(#selector(handleSignOut), with: nil, afterDelay: 0)
        }
    }

    func setUpNavigationBar(){
        navigationItem.title = "Covered"
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Sign Out", style: .plain, target: self, action: #selector(handleSignOut))
        navigationItem.leftBarButtonItem?.tintColor = .black
    }
    func setUpTableView(){
        tableView.dataSource = self
        tableView.delegate = self
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")

        view.addSubview(tableView)
        _ = tableView.anchor(view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, topConstant: 0, leftConstant: 0, bottomConstant: 0, rightConstant: 0, widthConstant: view.frame.width, heightConstant: view.frame.height)
    }
    @objc func handleSignOut(){

        do{
            try Auth.auth().signOut()
        } catch let logOutError{
            print("Here is the log out error: /n")
            print(logOutError)
        }

        //change state of user default
        UserDefaults.standard.setIsLoggedIn(value: false)

        //present login controller
        let loginController = LoginController()
        present(loginController, animated: true, completion: nil)
    }

}

class BarCell: UITableViewCell{
    let cellView: UIView = {
        let view = UIView()
        view.backgroundColor = .white
        view.dropShadow()
        return view
    }()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?){
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setup()
    }

    func setup(){
        addSubview(cellView)
        _ = cellView.anchor(topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, topConstant: 4, leftConstant: 8, bottomConstant: 4, rightConstant: 8)
    }

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

我的错误出现在第32行,即:

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

为什么会发生这种情况?当我直接投射此行as! UITableViewCell时,我的代码运行良好。但是,我正在尝试这样做以设置每个单元格的外观。提前感谢任何建议。

1 个答案:

答案 0 :(得分:7)

问题在于:

tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")

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

不匹配。

如果您确实希望单元格的类型为BarCell,请注册BarCell而不是UITableViewCell

tableView.register(BarCell.self, forCellReuseIdentifier: "cell")