gpt4 book ai didi

ios - 在 Swift 中使用以编程方式创建的 UITableViewCell 子类

转载 作者:IT王子 更新时间:2023-10-29 05:05:16 24 4
gpt4 key购买 nike

我正在处理一个表格 View ,其中包含一个以编程方式创建的自定义单元格,没有使用 IB。我在 Google 上四处查看并在 NSChat 中四处询问,但我仍然无法让它工作。它只显示默认的 TableView 。提前致谢!

EventCell.swift

import UIKit

class EventCell: UITableViewCell {

var eventName: UILabel = UILabel()
var eventCity: UILabel = UILabel()
var eventTime: UILabel = UILabel()

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

self.contentView.addSubview(eventName)
self.contentView.addSubview(eventCity)
self.contentView.addSubview(eventTime)
}

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

override func layoutSubviews() {
super.layoutSubviews()

eventName = UILabel(frame: CGRectMake(20, 10, self.bounds.size.width - 40, 25))
eventCity = UILabel(frame: CGRectMake(0, 0, 0, 0))
eventTime = UILabel(frame: CGRectMake(0, 0, 0, 0))

}

}

ViewController.swift

class ViewController: UITableViewController, UITableViewDelegate {

var events: Dictionary<String, [String]> = ["0": ["Monroe Family", "La Cañada", "8:30"]]

override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self;
tableView.delegate = self;

tableView.registerClass(EventCell.self, forCellReuseIdentifier: "EventCell")
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()

}

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension;
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return events.count
}

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

var cellIdendifier: String = "EventCell"

var cell: EventCell = tableView.dequeueReusableCellWithIdentifier(cellIdendifier, forIndexPath: indexPath) as EventCell
cell = EventCell(style: .Default, reuseIdentifier: cellIdendifier)

if let i = events[String(indexPath.row)] {
cell.eventName.text = i[0]
cell.eventCity.text = i[1]
cell.eventTime.text = i[2]
}

cell.sizeToFit()

return cell


}
}

最佳答案

好的,首先是一些重要的评论。

首先,每次表格 View 请求单元格而不是重复使用旧单元格时,您都在不必要地创建自己的新单元格。你应该删除这一行:

cell = EventCell(style: .Default, reuseIdentifier: cellIdendifier)

这是不必要的,因为 dequeue 会根据您为给定标识符注册的类根据需要自动创建新单元格。

其次,在布置代码时不应使用主屏幕边界。如果您的表格 View 不是全宽,这将崩溃。相反,您可以使用 self.bounds,因此它始终相对于单元格本身。

第三,您不应该调用 setNeedsLayout 或 layoutIfNeeded,因为如果调用该方法,它已经重新布置了所有内容。

第四,您应该在设置表格 View 数据源之前注册您的表格 View 单元格类,以防万一 UITableView 在设置数据源时开始从数据源请求东西。

第五,您的两个 subview 的大小为 0,0,因此无论如何它们都不会显示。

如果此代码确实在没有崩溃的情况下运行,那么您正在创建 EventCells,因为您正在根据 dequeueReusableCellWithIdentifier:forIndexPath 的结果进行强制转换。这意味着您只是遇到布局/显示/数据问题。

关于ios - 在 Swift 中使用以编程方式创建的 UITableViewCell 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27585409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com