SWIFT 3未显示静态tableview中单元格的内容

时间:2017-06-30 00:44:40

标签: ios swift uitableview uikit

以下是我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(),结果是一样的。内容未显示。我正在使用dataSourceviewDelegateUITableViewController不是问题。

这是一张图片 enter image description here

2 个答案:

答案 0 :(得分:1)

问题是awakeFromNIB"在从Interface Builder档案或nib文件加载后,准备接收器以进行服务。"但是您以编程方式对其进行实例化,因此该方法不会被调用。理论上,您可以将代码移至init(style:reuseIdentifier:),确保在您的实现中调用super,并在此之后进行任何其他自定义。

但是,在使用静态单元格时,通常不会以编程方式实例化单元格。 (这是静态细胞的重点,IB会照顾你的一切。)在使用静态细胞时,你通常根本不会实现UITableViewDataSource

我建议使用动态表并有两个单元格原型,一个重用标识符为" NotAvailable"和#34;可用" (或者你想要的任何标识符)。然后以编程方式使用适当的标识符实例化单元格。 (顺便说一句,这也有一个优点,就是你的单元格可以完全用IB设计,​​而且不需要任何代码,至少对于那个单元格。)这样,故事板照顾实例化适当的细胞。

所以,这里我在动态表中有两个单元格原型,一个用于"不可用"和#34;可用":

enter image description here

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

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

这会产生:

enter image description here

现在,显然,我只是掀起了一个超级原始的模型,并没有在"可用的#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单元格,因此您应该直接从接口构建器链接单元格。