Swift Custom UITableViewCell 以编程方式工作并在单元格中显示,但 Storyboard IBOutlet 为 nil 并且不在单元格中显示

Posted

技术标签:

【中文标题】Swift Custom UITableViewCell 以编程方式工作并在单元格中显示,但 Storyboard IBOutlet 为 nil 并且不在单元格中显示【英文标题】:Swift Custom UITableViewCell Programmatically works and shows in cell but Storyboard IBOutlet is nil and does not show in cell 【发布时间】:2015-03-23 05:31:06 【问题描述】:

在我的自定义单元格 swift 文件 CustomTableView.swift 中,我可以通过编程方式为我的 TableView 创建标签,但是当我在 Storyboard 中使用 IBOutlet 时,标签总是为零

我很确定我的单元格不是零

import UIKit

class CustomTableViewCell: UITableViewCell 


    @IBOutlet weak var lblPostDate: UILabel!

    var message: UILabel = UILabel()



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

        self.message.frame = CGRectMake(0, 0, 100, 40);
        self.message.backgroundColor = UIColor.brownColor()
        self.message.text = "bla bla bla bla bla"
        self.addSubview(self.message)
    

    required init(coder aDecoder: NSCoder) 

        super.init(coder: aDecoder)

    

    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
    

    func setCell(postDate: String)
    
        self.lblPostDate?.text = postDate

    


在上面的代码中,可以在单元格中看到消息,但看不到作为 IBOutlet 的 lblPostDate

我很确定委托和数据源以及自定义单元标识符,但似乎 IBOutlets 没有正确初始化。我在调试时可以看到 lblPostDate 变为 nil

这是 XCode 6 的错误吗?

这是我从控制器调用的方式

import UIKit

class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    var items = ["one","two","three","four"]

    let kCellIdentifier: String = "CustomCell"

    @IBOutlet weak var mTableView: UITableView!


    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.mTableView.registerClass(CustomTableViewCell.classForCoder(), forCellReuseIdentifier:kCellIdentifier)
        //self.mTableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: kCellIdentifier)


    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        var cell:CustomTableViewCell! = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier, forIndexPath: indexPath)  as? CustomTableViewCell

        if (cell == nil) 

            self.mTableView.registerClass(CustomTableViewCell.classForCoder(), forCellReuseIdentifier: kCellIdentifier)
            cell = CustomTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: kCellIdentifier)
        

        if var label = cell.lblPostDate
            label.text = items[indexPath.row]
        
        else
            cell.setCell(items[indexPath.row])
        

        return cell
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return items.count
    

    func  tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
        return 44
    



【问题讨论】:

您是否已将情节提要中的 lblPostDate 连接到文件?我确定你没有 是的,我确实从 Storyboard 连接到单元类文件。我猜它不知何故无法识别它 【参考方案1】:

您必须将 lblPostDate 与单元格 xib 文件中的一个标签链接。

【讨论】:

我正在使用 Storyboard 并将其链接到我的单元类文件。如果我使用 Storyboard,我不必使用 xib 文件对吗?【参考方案2】:

这太疯狂了,我删除了注册类代码,它起作用了,我不敢相信

//self.mTableView.registerClass(CustomTableViewCell.classForCoder(), forCellReuseIdentifier:kCellIdentifier)

在我的 Controller 中注释掉 registerClass 后,它不再调用 init 函数,而是确实正确地创建了 lblPostDate

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

        self.message.frame = CGRectMake(0, 0, 100, 40);
        self.message.backgroundColor = UIColor.brownColor()
        self.message.text = "bla bla bla bla bla"
        self.addSubview(self.message)
    

所以我不再需要创建硬编码输入对象。

有趣的是,所有教程都建议注册课程。无论如何,它成功了!

【讨论】:

以上是关于Swift Custom UITableViewCell 以编程方式工作并在单元格中显示,但 Storyboard IBOutlet 为 nil 并且不在单元格中显示的主要内容,如果未能解决你的问题,请参考以下文章

swift4: custom log

Swift: 是用Custom Segue还是用Transition动画

如何使用Swift添加Table View搜索框

Swift Custom Response Serializer 随机返回图像

swift项目第二天:初始化项目

Swift Custom Cell 创建你自己的带有标签的 Cell