我正在尝试创建一个包含图像和标签的非常简单的表格视图。我试图自定义/样式每个单元格的内部(编程),因此我创建了一个名为" 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
时,我的代码运行良好。但是,我正在尝试这样做以设置每个单元格的外观。提前感谢任何建议。
答案 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")