Swift:不能以编程方式配置自定义表格单元格?没有调用初始化?

Posted

技术标签:

【中文标题】Swift:不能以编程方式配置自定义表格单元格?没有调用初始化?【英文标题】:Swift: can't configure custom table cell programmatically? Init not called? 【发布时间】:2016-08-25 14:50:00 【问题描述】:

好的,我正在尝试以编程方式将内容添加到我的自定义 tableview 单元格中,如 mob last question here 中所示 - Swift: tableview cell content is added again and again with each reload? 初始化 func tableView() 中的所有内容会导致重叠。

我已经逐字关注了这个问题Swift. Proper initialization of UITableViewCell hierarchy 在我的自定义单元类中(我在故事板中为其命名)我有:

class EventTableCellTableViewCell: UITableViewCell 


    override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
        super.init(style: style, reuseIdentifier: reuseIdentifier) // the common code is executed in this super call
        // code unique to CellOne goes here
        print("INIT")
        self.contentView.backgroundColor = UIColor.blackColor()
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
    

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code

    

并且没有调用这个 init,因为没有打印任何内容。错误出现在我的主 VC 中的 func tableView() 中。我原来有:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("eventCell", forIndexPath: indexPath) as! EventTableCellTableViewCell
//        cell.eventTitle.text = names[indexPath.row]
//        cell.eventDescription.text = descriptions[indexPath.row]

        cell.contentView.clipsToBounds = false

        //cell UIX
        let eventTitleLabel = UILabel()
        let dateLabel = UILabel()
        let authorLabel = UILabel()
        let locationLabel = UILabel()

        let categoryView = UIImageView()
//then I add everything 

但这没有用,所以我查看了其他帖子,现在有了:

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

        //var cell = tableView.dequeueReusableCellWithIdentifier("eventCell", forIndexPath: indexPath) as! EventTableCellTableViewCell

        var cell = tableView.dequeueReusableCellWithIdentifier("eventCell", forIndexPath: indexPath) as! UITableViewCell
        if (cell == nil) 
            cell = EventTableCellTableViewCell.init(style: .Default, reuseIdentifier: "eventCell")
        

我也尝试过不使用 indexPath。现在我收到一个错误,即单元格不能 == nil,无论我写什么 init 都不会被调用。

如何以编程方式配置我的单元?

【问题讨论】:

部分不相关但UITableView dequeueReusableCellWithIdentifier:forIndexPath: 永远不会返回nil 如果单元类代表故事板中的单元,则使用awakeFromNib 方法进行初始化 鉴于您引用的问题,您似乎正在尝试在没有情节提要的情况下执行此操作。是这样吗?如果没有,@vadian 的答案就是您要找的。​​span> @rmaddy 如果 dequeueReusableCell 永远不会返回 nil,你怎么知道何时需要调用 init 以及何时可以重用单元格?我有一个自定义初始化(带有我自己的参数),我不知道如何调用它并且仍然能够重用单元格 【参考方案1】:

如果在情节提要中设计了单元格,只调用了init?(coder aDecoder: NSCoder),则永远不会调用init(style: style, reuseIdentifier:

你必须在 Interface Builder 中将单元格的类设置为EventTableCellTableViewCell

【讨论】:

以上是关于Swift:不能以编程方式配置自定义表格单元格?没有调用初始化?的主要内容,如果未能解决你的问题,请参考以下文章

Swift UItableView 以编程方式自定义单元格(文档)?

使用 swift 4 以编程方式注册时未显示自定义单元格

UITableView 自定义单元格高度未正确管理 swift 中的动态约束

Swift Cocoa Touch 自定义单元格为 IBOutlets 返回 nil

以swift语言在自定义表格视图单元格中更新进度视图下载

Swift编程TableView不显示单元格