在 UICollectionView 中使用 reloadData 时如何从重新加载中排除标头
Posted
技术标签:
【中文标题】在 UICollectionView 中使用 reloadData 时如何从重新加载中排除标头【英文标题】:How to exclude header from reloading when using reloadData in UICollectionView 【发布时间】:2015-05-12 03:06:06 【问题描述】:我有一个UICollectionView
使用CSStickyHeaderFlowLayout
来模仿UITableView
中的标头行为。在标头内有SegmentedControl
来控制UICollectionView
上的数据。所以我想要的是在我点击段(调用 API)并执行 reloadData
时重新加载数据,但它总是调用
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
那么什么是仅重新加载数据而不是标题的最佳方法,因为当reloadData
时,标题也会重新加载,并且段将回到第一个状态。
这是我viewForSupplementaryElementOfKind
的代码
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
UICollectionReusableView *reusableView = nil;
if (kind == UICollectionElementKindSectionHeader)
SegmentHeaderView *collectionHeader= [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"Header" forIndexPath:indexPath];
HMSegmentedControl *segmentedControl = [[HMSegmentedControl alloc] initWithSectionTitles:@[@"Popular", @"Lelang"]];
[segmentedControl setFrame:CGRectMake(0, 0, self.view.frame.size.width, 45)];
[segmentedControl addTarget:self action:@selector(segmentedControlChangedValue:) forControlEvents:UIControlEventValueChanged];
segmentedControl.backgroundColor = [NConfig FlatButtonGray];
segmentedControl.selectionIndicatorColor = [UIColor whiteColor];
segmentedControl.selectionIndicatorBoxOpacity=1;
segmentedControl.titleTextAttributes = @NSForegroundColorAttributeName : [NConfig FlatButtonOrange];
segmentedControl.selectedTitleTextAttributes = @NSForegroundColorAttributeName : [NConfig FlatButtonOrange];
segmentedControl.selectionStyle = HMSegmentedControlSelectionStyleBox;
segmentedControl.selectedSegmentIndex = HMSegmentedControlNoSegment;
segmentedControl.selectionIndicatorLocation = HMSegmentedControlSelectionIndicatorLocationNone;
segmentedControl.shouldAnimateUserSelection = NO;
[segmentedControl setSelectedSegmentIndex:0 animated:YES];
[collectionHeader addSubview:segmentedControl];
reusableView = collectionHeader;
return reusableView;
有什么建议吗? :)
【问题讨论】:
【参考方案1】:您的错误是您将选择仅存储在可能会丢失的视图层中。当用户选择不同的段时,您确实应该使用新的选择索引设置一个属性。然后,您可以通过重新加载数据来对这个更改的属性做出反应。在返回标题视图之前,您将选定的段设置为您之前存储的索引。这样选择就不会丢失。
除此之外,您还应该避免使用 reloadData,而只重新加载实际更改的项目。
【讨论】:
以上是关于在 UICollectionView 中使用 reloadData 时如何从重新加载中排除标头的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView reloadData 无法正常工作
无法在UIInputViewController中使用UICollectionView进行键盘扩展
如何在 swift 中使用 @resultbuilder 使用 UICollectionView?
我可以在 1 UICollectionView 中使用 collectionViewCell 2 Cell 吗?
如何使用 UIViewControllerRepresentable 在 SwiftUI 中呈现 UICollectionView