我想外包一个tableView的委托和数据源协议。因此,我创建了一个新的TableViewController,为它创建了一个Cocoa Touch Class,并删除了故事板中现有的委托和数据源连接。最后,我以编程方式设置了委托和数据源。到目前为止,它工作得很好,但我有一个问题。请先看一下我的代码。
class TableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
let protocols = TableViewProtocols()
tableView.delegate = protocols
tableView.dataSource = protocols
}
}正如我所说的,它工作得很好,但我试图让它变得更容易,但这并不起作用
class TableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = TableViewProtocols()
tableView.dataSource = TableViewProtocols()
}
}在第一个示例中,我创建了一个TableViewProtocols对象并将其保存在protocols中。我将其分配给委托和数据源。这是有效的。
在第二个示例中,我没有保存TableViewProtocols的一个实例。相反,我在一行中一步完成了创建和赋值。这是行不通的。我也不知道为什么。因为对我来说它看起来是一样的。首先创建一个对象和直接在一行中创建和赋值有什么不同?
任何建议都会被采纳。谢谢。
发布于 2017-08-08 00:59:19
表视图不维护对其委托或数据源对象的强引用。因此,当您直接设置它们时,调用超出了作用域,对象被删除,表视图不再有委托或数据源。
即使使用表视图控制器,拥有不同的数据源和委托也是完全可以接受的。要做到这一点,一种简单的方法是让表视图控制器具有对您想要委托的对象的引用,并且它具有对该对象的强引用,然后在视图中设置委托和数据源:
类TableViewController: UITableViewController {
var协议= TableViewProtocols() //不是最好的名称,但它就是您所拥有的。
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = protocols
tableView.dataSource = protocols
}}
https://stackoverflow.com/questions/45545696
复制相似问题