所以我在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
替换所有其他声明。它完美地运作。
任何想法都错了吗?
答案 0 :(得分:2)
错误在我们的示例代码中。对于那个很抱歉。我应该责怪那个人。
问题可能是你不能制作非泛型类的通用子类......很快就会推出一个修复程序。
答案 1 :(得分:0)
你的桌子不知道你有多少部分。
您需要先实施numberOfSectionsInTableView:
。一旦它知道每个部分行会询问多少个部分。
答案 2 :(得分:0)
答案 3 :(得分:-2)
您可以尝试使用viewWillAppear
重新加载数据。当视图出现时,它将重新加载数据并更新表。试试这段代码:
override func viewWillAppear(animated: Bool) {
YourTableName.reloadData();
}