UIColletionView何时调用其数据源并委托方法

时间:2017-06-05 19:34:06

标签: ios swift uicollectionview

我使用自定义单元格创建了 UICollectionView 。在 viewDidLoad()方法中,我正在注册我的单元类。

   collectionView?.register(CustomCell.self, forCellWithReuseIdentifier: cellId)
  collectionView?.reloadData()

在调试我的代码以检查行为时,我看到在我注册我的collectionView并使用自定义Cellclass调用collectionView.reloadData()的行中,没有数据源和委托方法像etcForItem那样执行了吗?为什么会这样?

2 个答案:

答案 0 :(得分:3)

viewDidLoad()在您的视图加载完成后调用,但视图布局之前,即在其框架正确设置之前调用。

根据我的观察,在布局过程中,集合视图会懒洋洋地调用其数据源方法(如cellForItem(at:))。毕竟,如果数据源大小为.zero或其位置当前是非屏幕的,则根本不需要调用数据源方法!

所以简而言之:

没有理由在viewDidLoad()中调用您的集合视图的数据源方法

据我所知,调用reloadData()只会丢弃所有可见单元格和装饰视图,以便在下一次布局过程中重新加载 。当集合视图当前可见时,会立即触发新的布局传递,但在viewDidLoad()中,集合视图甚至不在屏幕上。 (viewDidAppear()尚未被调用。)

答案 1 :(得分:0)

你正在做的工作人员很奇怪,注册单元格后,你正在重新加载collectionView数据..为什么?当数据数组发生变化时,您应该重新加载数据。但无论如何,尝试在主线程上调用reloadData。

DispathQueue.main.async {
   self.collecitonView.reloadData()
}