Swift TableViewDataSource分离其他类

时间:2018-04-29 21:52:50

标签: swift uitableview tableview

我有两个例子

第一

override func viewDidLoad() {
    super.viewDidLoad();
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    tableView.dataSource = TableViewDataSource();
}

第二

var dataSource:TableViewDataSource!;

override func viewDidLoad() {
    super.viewDidLoad();
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    dataSource = TableViewDataSource();
    tableView.dataSource = dataSource;
}

第一个例子不起作用但第二个起作用。这些不一样吗?两个例子有什么区别?

2 个答案:

答案 0 :(得分:1)

第一个不起作用,因为你必须设置一个强引用

tableView.dataSource = TableViewDataSource();

而另一个人在这里

var dataSource:TableViewDataSource!;

//

如果您查看了dataSource委托实现文件,它就像这样声明

weak open var dataSource:UITableViewDataSource?

无视,因此它不会保留分配给它的变量,这就是为什么必须强烈引用其他类实例的原因

enter image description here

答案 1 :(得分:0)

UITableView dataSource是一个弱小的属性。您的第一个示例不起作用,因为没有对您创建的TableViewDataSource实例的强引用。到达viewDidLoad结束时,实例将被取消分配,dataSource将重置为nil

您的第二个示例有效,因为您的类的dataSource属性保留了对TableViewDataSource实例的强引用。只要您的视图控制器存在,TableViewDataSource将存在,并且表视图的数据源将起作用。