Swift 中的通用 UITableViewController 编译但不重新加载其数据

Generic UITableViewController in Swift compiles but doesn't reload its data

所以我阅读了 article over at objc.io 关于功能性 TableViewController 的文章。听起来和看起来都很干净,所以我不得不尝试。

import Foundation
import UIKit

class TableViewController<A>: UITableViewController {

    override init(style: UITableViewStyle) {
        super.init(style: style)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    var data: [A] = [] {
        didSet { self.tableView.reloadData() }
    }

    var configureCell: (UITableViewCell, A) -> () = { _ in () }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
        configureCell(cell, data[indexPath.row])
        return cell
    }

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

这编译得很好。我用下面的代码初始化它。

let controller = TableViewController<String>(style: .Plain)
controller.configureCell = { (cell:UITableViewCell, data:String) in 
    cell.textLabel?.text = data
}
controller.data = ["1", "2"]

但是 numberOfRowsInSection 从未被调用(因此 cellForRowAtIndexPath 也未被调用)。然而,didSet { self.tableView.reloadData() } 被称为。

我还检查了 tableView 的数据源和委托是否正确。

因此,如果我在 class 声明中删除 <A>,并将所有其他内容替换为 String。它工作得很好。

有什么想法吗?

您可以尝试使用 viewWillAppear 重新加载数据。当视图出现时,它将重新加载数据并更新 table。试试这个代码:

override func viewWillAppear(animated: Bool) {
    YourTableName.reloadData();
}

你的table不知道你有多少版块

您需要先实施 numberOfSectionsInTableView:。一旦它知道有多少个部分,它将要求每个部分行。

错误在我们的示例代码中。对于那个很抱歉。我是罪魁祸首。

问题可能是您无法制作非通用 class 的通用子 class...很快就会推出修复程序。

正如 Chris 所说,不幸的是 swift 不支持非泛型的泛型子类化。 顺便说一句,我已经实现了类似需求的绕过: https://github.com/dimpiax/FlexibleTableViewController