2015-10-19 83 views
1

我目前正在以编程方式学习Swift。我想将tableView添加到viewController(为了能够稍后操作约束)并使用TableViewCell自定义单元格。TableView中的空单元格与自定义TableViewCell - Swift

当我使用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 
} 

} 

回答

3

你好@迈克尔的第一件事是,你应该只使用awakeFromNib时您正在使用的.xib(NIB)和你的情况,你正在使用自定义类没有这样的厦门国际银行是这样,你应该使用

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) 
} 

你也应该在使用它之前初始化你的标签。 这将解决您的问题。

阅读苹果的UITableViewCell的子类文档here

+0

谢谢!这是我在被@replman指向正确方向之后得到的结果。 “使用前初始化您的标签”意味着什么。它已初始化。 – Geppelt

+0

你只是设置了UILabel的框架,因为在你添加到任何视图之前,你还没有为你的单元格创建xib,所以最好这样做,所以你最终不会得到零对象。还应该在cell类中实现prepareForReuse方法,以便在下次使用该对象之前进行清理。 –

+0

我不想要一个xib文件,我不明白你的意思; UIImageView被声明,构建并添加。我不是经验和问题的零对象。 – Geppelt

1

如果你想要厦门国际银行这样做有时会像你的自定义单元格,从一些自定义加载:

tableView.registerNib(UINib(nibName: "CustomTableViewCell", bundle: NSBundle.mainBundle()), forCellReuseIdentifier: "CustomTableViewCell") 

如果您还有CustomTableViewCell.xib文件,你必须表视图细胞重用标识符CustomTableViewCell

+0

是的,但正如我所说我正在编程。所以我已经注册了课程。 – Geppelt

+0

帮助我,谢谢。有关此方法的文章:https://medium.com/@musawiralishah/creating-custom-uitableviewcell-using-nib-xib-files-in-xcode-9bee5824e722 – comm1x

0

结帐您单元的companyLabel的布局方式。它存在还是不存在?

在您的代码中,我将companyLabel替换为默认值textLabel,它适用于我。

cell.textLabel!.text = self.items[indexPath.row] 
+0

这是单元格的“默认”textLabel(对齐的中心Y )。我的标签“companyName”位于0,0,因此如果它出现,它将被放在左上角。 我想弄清楚为了添加更多的项目到TableViewCell。 – Geppelt

+0

这里的想法是 - 你的表格视图没有任何问题。如果默认的单元格文本标签出现,那么您的调试范围将缩小到自定义单元格。祝你好运! – Abhinav

0

我觉得awakeFromNib没有被调用,因为你没有注册一个笔尖,而是一个类。试试这个:

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) 
    } 
} 
+0

那将是什么样子? – Geppelt

+0

类似这样的: 'override init(style:UITableViewCellStyle,reuseIdentifier:String?){ super.init(style:style,reuseIdentifier:reuseIdentifier) }' – Geppelt

+0

这样做的窍门!感谢支持@replman – Geppelt

相关问题