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

时间:2015-03-19 10:17:41

标签: ios uitableview swift generics

所以我在article阅读了关于功能性TableViewControllers的objc.io。听起来很干净所以我不得不尝试。

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是否正确配置了dataSource和委托。

因此,如果我在类声明中删除<A>,并用String替换所有其他声明。它完美地运作。

任何想法都错了吗?

4 个答案:

答案 0 :(得分:2)

错误在我们的示例代码中。对于那个很抱歉。我应该责怪那个人。

问题可能是你不能制作非泛型类的通用子类......很快就会推出一个修复程序。

答案 1 :(得分:0)

你的桌子不知道你有多少部分。

您需要先实施numberOfSectionsInTableView:。一旦它知道每个部分行会询问多少个部分。

答案 2 :(得分:0)

克里斯说,不幸的是,swift不支持非泛型的泛型子类化。 顺便说一句,我已经意识到绕过类似的需求: https://github.com/dimpiax/FlexibleTableViewController

答案 3 :(得分:-2)

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

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