这是一个玩具示例,但它完全减少了我所处的情况:
class MyDataSource: UITableViewDiffableDataSource<String,String> {
var string : String?
init(string:String?) {
self.string = string
super.init(tableView: UITableView()) { (_, _, _) -> UITableViewCell? in
print(self.string) // error
return nil
}
}
}
我试图使我的表视图数据源独立,到目前为止,我的方法是将UITableViewDiffableDataSource子类化。除非我尝试为子类提供自定义初始化程序,否则此方法工作正常。玩具示例显示了问题。
我要填充单元格的方式绝对取决于一个值,该值可以在数据源的生命周期中稍后更改。因此,不能将其硬编码到单元提供程序功能中。我不能在这里简单地指代string
,它是在初始化程序中传递的值。我必须参考self.string
,因为稍后其他代码将有权更改此数据源的string
实例属性,并且我希望单元格提供程序在发生这种情况时使用该新值。
但是,我收到错误消息“初始化所有成员之前,闭包自身捕获了该错误”。那似乎不公平。我did在调用string
之前初始化我的super.init
实例属性。因此,它在最早可以调用像元提供者方法时确实具有一个值。
您可以通过tableView.datasource访问self,它将解决大多数问题。