【问题标题】:When does the UIColletionView calls his datasource and delegate methodsUIColletionView 什么时候调用他的数据源和委托方法
【发布时间】:2017-06-05 19:34:06
【问题描述】:

我创建了一个带有自定义单元格的 UICollectionView。在 viewDidLoad() 方法中,我正在注册我的 cellclass。

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

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

【问题讨论】:

  • 什么都没发生是什么意思?您是否设置了数据源和委托?
  • 是的,我设置了我的数据源和委托,并且 collectionView 工作正常,因为我在另一个函数内部调用 self.collectionView.reloadData 。我只是想知道为什么没有像 cellForItem 等方法没有在 viewDidLoad 内部执行

标签: ios swift uicollectionview


【解决方案1】:

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

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

简而言之:

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


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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我知道这很奇怪,我这样做是为了了解 collectionView 的行为。我认为在 viewDidLoad 中注册单元格时,数据源和委托方法将被称为初始方法。当我看到什么都没发生时,我尝试了 reloadData。因此,此时将调用数据源和委托方法。我在注册cellClass时想=
    • 是的,应该调用委托方法。尝试向我们展示您的实现,以便我们为您提供帮助。但现在,不知道该建议您什么。可能是你忘记了要实现的东西,因为这个 collectionView 有点棘手..
    猜你喜欢
    • 2012-07-13
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多