Swift TableViewDataSource 分离其他类

Posted

技术标签:

【中文标题】Swift TableViewDataSource 分离其他类【英文标题】:Swift TableViewDataSource Separate Other Class 【发布时间】:2018-04-29 21:52:49 【问题描述】:

我有两个例子

第一

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;

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

【问题讨论】:

不相关,但在 Swift 中,行尾不需要分号 (;)。 @rmaddy 是的,我知道,但这是习惯:D 好好改掉这个习惯吧。每次换档时,您是否将左脚踩在自动变速器汽车的地板上? 【参考方案1】:

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

tableView.dataSource = TableViewDataSource();

而另一个在这里有它

var dataSource:TableViewDataSource!;

//

如果你查看 dataSource 委托实现文件,它是这样声明的

weak open var dataSource:UITableViewDataSource?

仔细观察 weak 所以它不会保留分配给它的变量,这就是为什么必须强引用其他类实例的原因

【讨论】:

为什么我需要强参考?结果 2 示例返回相同的东西是吗?【参考方案2】:

UITableView dataSource 是一个弱属性。您的第一个示例不起作用,因为没有对您创建的 TableViewDataSource 实例的强引用。到达viewDidLoad 的末尾时,实例被释放,dataSource 被重置回nil

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

【讨论】:

但结果是一样的,是吗? TableViewDataSource() 返回对象并赋值tableview.dataSource 我不明白你的评论。你的两个例子不一样,我解释了为什么它们不同。

以上是关于Swift TableViewDataSource 分离其他类的主要内容,如果未能解决你的问题,请参考以下文章

iOS 瘦身ViewController 分离tableViewDataSource

重叠表格单元格内容[关闭]

如何在 UIViewController 中使用 TableView?

来自 .xib 文件的自定义 UITableViewCell

UITableView 在 IOS 7 与 IOS 6 中的行为不同

iOS:查找要从服务器中删除的项目的 NSArray