我是swift的新手,我尝试自定义UITableViewCell
,我在youtube和互联网上看到很多教程。但我不能这样做,我试图解决很多问题,但没有任何改变。
这是我的代码:
class movieViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
var categories = ["Action", "Drama", "Science Fiction", "Kids", "Horror"]
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var btnMenu: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
btnMenu.target = self.revealViewController()
btnMenu.action = Selector("revealToggle:")
self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
self.revealViewController().rearViewRevealWidth = 200
self.tableView.registerClass(CategoryRow.self, forCellReuseIdentifier: "Cell")
// Do any additional setup after loading the view.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return categories[section]
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return categories.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CategoryRow
cell.labelA.text = self.categories[indexPath.row]
cell.labelB.text = self.categories[indexPath.row]
return cell
}
CategoryRow.swift:
class CategoryRow: UITableViewCell {
var labelA: UILabel!
var labelB: 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 :(得分:3)
您尚未在标签栏中链接labelA。 Creating an Outlet Connection
答案 1 :(得分:3)
好像你没有xib。而你只是声明你的标签,但你没有初始化它。因此labelA
和labelB
将为零。它会崩溃。
如果你不想要xib,你必须在CategoryRow
中实现两个函数,如下面的代码:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.labelA = UILabel(frame: CGRectMake(0,0, self.contentView.frame.size.width, self.contentView.frame.size.height))
//Same here for labelB
self.contentView.addSubview(labelA)
}
另一种方法是创建名称与您的类相同的xib UITableCiewCell
。并设置此单元格是您的类。您可以在此xib中设计labelA
和labelB
,然后将其添加到类中。并在viewDidLoad
self.tableView.registerNib(UINib(nibName: "nameYourxib"), forCellReuseIdentifier: "Cell")
答案 2 :(得分:1)
答案 3 :(得分:0)
@vien vu回答是对的,但没有XIB怎么办? Here是swift中自定义单元格的完整解决方案
答案 4 :(得分:-3)
您需要在viewDidLoad
中添加委托数据源viewDidLoad() {
self.tableView.delegate = self
self.tableView.datasource = self
}
你需要通过outlet而不是变量来创建labelA和labelB。保持控制并从故事板拖动到相应的文件然后放开,选择插座并将其命名为labelA和labelB