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 以编程方式自定义单元格(文档)?
UITableView 自定义单元格高度未正确管理 swift 中的动态约束