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