以下是我tableView(_:cellForRowAt:)
的实现:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let index = indexPath.section
let weekDay = WeekDays.day(at: index)
if self.availability.numberOfTimeslots(for: weekDay) == 0 {
let cell = NotSelectedCell(style: .default, reuseIdentifier: nil)
return cell
}
return UITableViewCell()
}
以下是我的自定义表格视图单元格的代码:
class NotSelectedCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
self.backgroundColor = .red
self.textLabel?.numberOfLines = 0
self.textLabel?.textAlignment = .center;
self.textLabel?.text = "Not Available"
}
}
我也尝试初始化自定义单元格cell = NotSelectedCell()
,结果是一样的。内容未显示。我正在使用dataSource
,viewDelegate
或UITableViewController
不是问题。
答案 0 :(得分:1)
问题是awakeFromNIB
"在从Interface Builder档案或nib文件加载后,准备接收器以进行服务。"但是您以编程方式对其进行实例化,因此该方法不会被调用。理论上,您可以将代码移至init(style:reuseIdentifier:)
,确保在您的实现中调用super
,并在此之后进行任何其他自定义。
但是,在使用静态单元格时,通常不会以编程方式实例化单元格。 (这是静态细胞的重点,IB会照顾你的一切。)在使用静态细胞时,你通常根本不会实现UITableViewDataSource
。
我建议使用动态表并有两个单元格原型,一个重用标识符为" NotAvailable"和#34;可用" (或者你想要的任何标识符)。然后以编程方式使用适当的标识符实例化单元格。 (顺便说一句,这也有一个优点,就是你的单元格可以完全用IB设计,而且不需要任何代码,至少对于那个单元格。)这样,故事板照顾实例化适当的细胞。
所以,这里我在动态表中有两个单元格原型,一个用于"不可用"和#34;可用":
然后代码将查看模型以确定要实例化的内容:
// for the complicated cell where I want to show details of some window of availability, add IBOutlets for that cell's labels
class AvailableCell: UITableViewCell {
@IBOutlet weak var startLabel: UILabel!
@IBOutlet weak var stopLabel: UILabel!
@IBOutlet weak var doctorLabel: UILabel!
}
// some super simple model to represent some window of availability with a particular doctor in that office
struct Availability {
let start: String
let stop: String
let doctor: String
}
class ViewController: UITableViewController {
let days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
let available = ...
override func numberOfSections(in tableView: UITableView) -> Int {
return days.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return available[days[section]]?.count ?? 1
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return days[section]
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// see if there are any available windows for the given day, if not, return "not available" cell
guard let availabilities = available[days[indexPath.section]] else {
return tableView.dequeueReusableCell(withIdentifier: "NotAvailable", for: indexPath)
}
// otherwise, proceed with the more complicated "Available" cell where I have to populate various labels and the like
let cell = tableView.dequeueReusableCell(withIdentifier: "Available", for: indexPath) as! AvailableCell
let availability = availabilities[indexPath.row]
cell.startLabel.text = availability.start
cell.stopLabel.text = availability.stop
cell.doctorLabel.text = availability.doctor
return cell
}
}
这会产生:
现在,显然,我只是掀起了一个超级原始的模型,并没有在"可用的#34;中进行任何UI设计。除了插入三个标签之外的单元原型。但它说明了这个想法:如果您的动态表具有多个独特的单元设计,只需为每个具有唯一标识符的单元原型实现,并实例化相应的标识符。通过这种方式,您可以享受完整的单元重用,最大限度地减少您必须以编程方式进行的视觉设计等等。
答案 1 :(得分:0)
使用静态单元格时,不应该使用cellForRow:atIndexPath方法。细胞是静止的,因此加载流量不同。我建议将单元格从界面构建器单独连接到视图控制器。
但是,如果你想这样做,你必须通过调用“超级”来获取你的单元格,因为那是实际生成静态单元格的类。
UITableView with static cells without cellForRowAtIndexPath. How to set clear background?
编辑:
我刚注意到这是错误的:
if self.availability.numberOfTimeslots(for: weekDay) == 0 {
let cell = NotSelectedCell(style: .default, reuseIdentifier: nil)
return cell
}
您必须使用“dequeueReusable”方法或其他方法。然后,这些是STATIC单元格,因此您应该直接从接口构建器链接单元格。