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
所以我阅读了 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