我想外包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
的实例。相反,我在一行中创建并分配了一步。
这不起作用。我不知道为什么。因为对我来说它看起来是一样的。首先创建一个对象和创建并直接在一行中分配有什么区别?
任何建议都是适当的。 谢谢。
答案 0 :(得分:0)
表视图不保留对其委托或数据源对象的强引用。因此,当您直接设置它们并且调用超出范围时,对象将被删除,并且tableview不再具有委托或数据源。
即使使用表视图控制器,拥有不同的数据源和代理也是完全可以接受的。一个简单的方法是让表视图控制器具有对您要委托的对象的引用,并且它具有强引用,然后在视图中设置委托和数据源加载:
class TableViewController:UITableViewController {
var protocols = TableViewProtocols()//不是最好的名字,但它是你拥有的。
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = protocols
tableView.dataSource = protocols
}
}