静态表格视图中单元格的内容未显示 SWIFT 3

Posted

技术标签:

【中文标题】静态表格视图中单元格的内容未显示 SWIFT 3【英文标题】:Content of a cell in static tableview isn't shown SWIFT 3 【发布时间】:2017-06-30 00:44:40 【问题描述】:

这是我对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(),结果是一样的。内容不显示。 dataSourceviewDelegate 不是问题,因为我正在使用 UITableViewController

这是一张图片

【问题讨论】:

你确定你的self.availability.numberOfTimeslots(for: weekDay)不等于0吗? @FangmingNing 是的,我是。 @Rob 是的,我在情节提要的表格视图属性的内容下选择了“静态单元格”,是的,cellForRowAt 被调用。 @Rob 在我的视图控制器中,每个部分都可能有一个或多个单元格。我应该在两种情况下都使用动态单元格还是使用静态单元格以防我在一个部分中只需要一个单元格? 【参考方案1】:

问题是awakeFromNIB“在从 Interface Builder 存档或 nib 文件加载接收器后准备服务。”但是您正在以编程方式实例化它,因此不会调用该方法。理论上,您可以将代码移动到 init(style:reuseIdentifier:),确保在您的实现中调用 super,然后在此之后进行任何额外的自定义。

但是,您通常不会在使用静态单元格时以编程方式实例化单元格。 (这是静态单元格的关键,IB 会为您处理一切。)使用静态单元格时,您通常根本不会实现UITableViewDataSource

我建议使用动态表并有两个单元原型,一个具有“NotAvailable”的重用标识符,一个具有“Available”(或您想要的任何标识符)。然后使用适当的标识符以编程方式实例化单元格。 (顺便说一句,这还有一个优点,即您的具有“NotAvailable”的单元格可以完全在 IB 中设计,并且不需要代码,至少对于该单元格。)这样,情节提要负责实例化适当的单元格。

所以,我的动态表中有两个单元格原型,一个用于“不可用”,一个用于“可用”:

然后代码会查看模型以确定要实例化的模型:

// 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
    

这将产生:

现在,很明显,我只是制作了一个超级原始模型,除了插入三个标签之外,并没有在“可用”单元格原型中进行任何 UI 设计。但它说明了这个想法:如果您的动态表有多个唯一的单元格设计,只需为每个具有唯一标识符的单元格原型实现并实例化适当的一个。通过这种方式,您可以享受完整的单元重用,最大限度地减少您必须以编程方式进行的视觉设计等等。

【讨论】:

【参考方案2】:

在使用静态单元格时,您不应该使用 cellForRow:atIndexPath 方法。单元格是静态的,因此加载流程不同。我的建议是将单元格从界面构建器单独连接到您的视图控制器。

仍然,如果你想这样做,你必须通过调用“super”来获取你的单元格,因为那是实际生成静态单元格的类。

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”方法或其他方法。再说一遍,这些是静态单元格,因此您应该直接从界面构建器链接单元格。

【讨论】:

在我的视图控制器中,每个部分都可能有一个或多个单元格。我应该在两种情况下都使用动态单元格还是使用静态单元格以防我在一个部分中只需要一个单元格? 仅当单元格数量“永不改变”时才应使用静态单元格。这允许您通过界面构建​​器完全设置它们,(标题、格式、颜色、背景)还允许您将它们视为普通 UIView(通过 IBOutlet 从您的 VC 引用它们)。在您的情况下,如果您无法确定每个部分会有多少个单元格,那么您绝对应该使用动态单元格。

以上是关于静态表格视图中单元格的内容未显示 SWIFT 3的主要内容,如果未能解决你的问题,请参考以下文章

设置静态表格视图单元格的复选标记

Swift 3 - 已展开第一个单元格的可展开表格视图单元格

应用于控制器的背景未应用于故事板swift中的表格视图单元格

如何在swift 3中删除tableview中特定单元格的按钮

Nib 文件中的静态单元格未显示

表格内容在使用子视图的自定义单元格的 TableView 滚动上消失 - Swift