在数据重新加载期间保持自定义 UICollectionViewLayout 中视图的第一响应者状态

Posted

技术标签:

【中文标题】在数据重新加载期间保持自定义 UICollectionViewLayout 中视图的第一响应者状态【英文标题】:Maintaining the first responder status of a view in a custom UICollectionViewLayout across data reloads 【发布时间】:2018-08-14 23:26:38 【问题描述】:

我正在从头开始开发UICollectionViewLayout。我想实现一个交错的网格布局,也就是 Pinterest 布局。我知道,那里有很多,但几乎所有这些都只支持静态项目高度,而我希望动态计算项目高度。

我让布局过程正常工作,但现在我偶然发现了一个问题。我想在部分标题中添加一个搜索栏。问题是每当我调用collectionView.reloadData() 时,搜索栏都会丢失第一响应者状态(同时保持其他状态,例如当前值)。

我尝试了通常的解决方法(例如在reloadData() 之后立即调用searchBar.becomeFirstResponder()),但没有帮助。另一种解决方法是将标题与搜索栏和项目放在单独的部分中,并且只重新加载带有项目的部分,但我的布局目前只支持一个部分,很高兴在花时间之前知道这是否真的能解决问题实现对多个部分的支持(否则我不需要)。

是什么导致搜索栏失去第一响应者状态,我该如何防止这种情况? 我对自定义 UICollectionViewLayouts 没有太多经验,因此我也希望了解有关幕后情况的任何信息(重新加载数据时以及一般情况下)。

【问题讨论】:

发生这种情况是因为如果从视图层次结构中删除任何视图,它就会停止为firstResponder。重新加载数据时,所有可重用视图(节标题也可重用)从超级视图中删除,进入可重用队列,然后从该队列中出列。解决方案可以是仅重新加载某些索引路径上的特定单元格,或仅重新加载非搜索栏部分,以便可以将部分标题保留在视图层次结构中。或者使用更复杂的视图设置(例如,每个部分都包含集合视图的表格视图)。 【参考方案1】:

我最终实现了对多个部分的支持,将标题与搜索栏放在一个单独的部分中,并且只重新加载包含项目的部分。似乎这种解决方法也适用于自定义布局。

【讨论】:

以上是关于在数据重新加载期间保持自定义 UICollectionViewLayout 中视图的第一响应者状态的主要内容,如果未能解决你的问题,请参考以下文章

重新加载页面后保持按钮处于活动状态(使用 PHP 和 HTML)

在滚动期间重用 UICollectionViewCells

在页面重新加载后保持活动选项卡时加载 ajax 内容(引导 4)

重新加载页面自定义获取的数据

从自定义单元格重新加载表格视图数据

js阻止页面刷新