我目前正在以编程方式学习Swift
。我想向tableView
添加viewController
(以便以后能够操纵约束)并使用TableViewCell
自定义单元格。
我可以在使用storyboard
时关闭我的眼睛,但是当我尝试用直接代码完成时,我有空单元格。
我的故事板由一(1)个空viewController
组成,其自定义类为ViewController
我看过其他有类似问题的人,但没有解决方案有效。很想知道我在忽视什么(可能是简单的东西)。在此先感谢您的帮助!
ViewController.swift:
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
var tableView: UITableView = UITableView()
var items: [String] = ["Viper", "X", "Games"]
override func viewDidLoad() {
tableView.frame = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height)
tableView.delegate = self
tableView.dataSource = self
tableView.registerClass(TableViewCell.self, forCellReuseIdentifier: "cell")
self.view.addSubview(tableView)
}
func tableView(tableView:UITableView, heightForRowAtIndexPath indexPath:NSIndexPath)->CGFloat
{
return 50
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return self.items.count
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableViewCell
//cell.textLabel?.text = self.items[indexPath.row]
cell.companyName.text = "name"
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
TableViewCell:
import UIKit
class TableViewCell: UITableViewCell {
var companyName = UILabel()
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
companyName.frame = CGRectMake(0, 0, 200, 20)
companyName.translatesAutoresizingMaskIntoConstraints = false
contentView.addSubview(companyName)
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
答案 0 :(得分:4)
你好@Michael首先,你应该只在你使用.xib(Nib)时使用awakeFromNib,而在你的情况下你使用没有这样的xib的自定义类,你应该使用
override init(style: UITableViewCellStyle, reuseIdentifier: String?){
super.init(style: style, reuseIdentifier: reuseIdentifier)
companyName = UILabel(frame: CGRectMake(0, 0, 200, 20))
contentView.addSubview(companyName)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
您也应该在使用之前初始化您的标签。 这将解决您的问题。
阅读Apple的文档,了解UITableViewCell的基类here。
答案 1 :(得分:1)
如果您希望自定义单元格从某些自定义xib加载,您有时会喜欢:
tableView.registerNib(UINib(nibName: "CustomTableViewCell", bundle: NSBundle.mainBundle()), forCellReuseIdentifier: "CustomTableViewCell")
您应该拥有CustomTableViewCell.xib
文件,其中包含具有重用标识符的表格视图单元格CustomTableViewCell
答案 2 :(得分:0)
查看您的单元格companyLabel
的布局方式。它存在与否?
在您的代码中,我将companyLabel
替换为默认textLabel
,这对我有用。
cell.textLabel!.text = self.items[indexPath.row]
答案 3 :(得分:0)
我认为没有调用awakeFromNib,因为你没有注册一个nib而是一个类。试试这个:
class TableViewCell: UITableViewCell {
let companyName = UILabel()
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// Initialization code
companyName.frame = CGRectMake(0, 0, 200, 20)
companyName.translatesAutoresizingMaskIntoConstraints = false
contentView.addSubview(companyName)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}