UICollectionView 单元内部已加载,但 UICollectionView 未显示
Posted
技术标签:
【中文标题】UICollectionView 单元内部已加载,但 UICollectionView 未显示【英文标题】:UICollectionView Cell Internally loaded but UICollectionView is not Showing 【发布时间】:2014-11-11 06:03:23 【问题描述】:似乎单元格在内部加载,但 UICollectionView 没有出现。
CollectionViewCell.xib and CollectionResuableView.xib
也包含在项目中。
CollectionView 是黑色的遗骸。
为什么它不起作用?我使用 Xcode 6 并使用以下代码。
ViewController.h
#import <UIKit/UIKit.h>
#import "CollectionReusableView.h"
#import "CollectionViewCell.h"
@interface ViewController : UIViewController<UICollectionViewDelegate,UICollectionViewDataSource>
@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
[self _setup];
- (void)_setup
self.collectionView.delegate = (id)self;
self.collectionView.dataSource = (id)self;
[self.collectionView registerNib:[UINib nibWithNibName:@"CollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"Cell"];
[self.collectionView registerNib:[UINib nibWithNibName:@"CollectionReusableView" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Section"];
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
return 3;
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
if ([kind isEqualToString:UICollectionElementKindSectionHeader])
CollectionReusableView *sectionView = [self.collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Section" forIndexPath:indexPath];
sectionView.label.text = [NSString stringWithFormat:@"Section%ld", indexPath.section + 1];
return sectionView;
else
return nil;
- (NSInteger) collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
return 10;
- (CollectionViewCell *) collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath
CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier: @"Cell" forIndexPath:indexPath];
cell.label.text = [NSString stringWithFormat:@"Row: %li",(long)indexPath.row];
NSLog(@"%@",[cell.label debugDescription]);
return cell;
@end
NSLog(@"%@",[cell.label debugDescription]);
2014-11-11 14:54:46.899 collectionViewSample[7242:1226917] <UILabel: 0x7fd492c54af0; frame = (58 14; 42 21); text = 'Row: 0'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fd492c54c50>>
2014-11-11 14:54:46.900 collectionViewSample[7242:1226917] <UILabel: 0x7fd492c58850; frame = (58 14; 42 21); text = 'Row: 1'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fd492c589b0>>
2014-11-11 14:54:46.900 collectionViewSample[7242:1226917] <UILabel: 0x7fd492c5c5c0; frame = (58 14; 42 21); text = 'Row: 2'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fd492c5c720>>
2014-11-11 14:54:46.901 collectionViewSample[7242:1226917] <UILabel: 0x7fd492c60360; frame = (58 14; 42 21); text = 'Row: 3'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fd492c604c0>>
2014-11-11 14:54:46.901 collectionViewSample[7242:1226917] <UILabel: 0x7fd492c64130; frame = (58 14; 42 21); text = 'Row: 4'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fd492c64290>>
2014-11-11 14:54:46.902 collectionViewSample[7242:1226917] <UILabel: 0x7fd492c67d20; frame = (58 14; 42 21); text = 'Row: 5'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fd492c67e80>>
2014-11-11 14:54:46.902 collectionViewSample[7242:1226917] <UILabel: 0x7fd492c6bac0; frame = (58 14; 42 21); text = 'Row: 6'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fd492c6bc20>>
2014-11-11 14:54:46.903 collectionViewSample[7242:1226917] <UILabel: 0x7fd492c6f8a0; frame = (58 14; 42 21); text = 'Row: 7'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fd492c6fa00>>
2014-11-11 14:54:46.903 collectionViewSample[7242:1226917] <UILabel: 0x7fd492c73610; frame = (58 14; 42 21); text = 'Row: 8'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fd492c73770>>
2014-11-11 14:54:46.904 collectionViewSample[7242:1226917] <UILabel: 0x7fd492c771d0; frame = (58 14; 42 21); text = 'Row: 9'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fd492c77330>>
【问题讨论】:
在IB中改变Cell的ContentView大小时可以显示。 【参考方案1】:Collectionview 没有出现,所以我认为collectionview 布局存在问题,因此首先在您的视图控制器中实现委托 UICollectionViewDelegateFlowLayout 并尝试添加一些collectionview 的委托方法以检查它是否正确触发其委托,以便为您提供帮助。
【讨论】:
在ViewController中添加UICollectionViewDelegateFlowLayout,但问题无法解决。 numberOfSectionsInCollectionView 、 viewForSupplementaryElementOfKind 、 numberOfItemsInSection 和 cellForItemAtIndexPath 正在触发。【参考方案2】:在所有委托方法等都在工作时,我花了两个工作日为 UICollectionView 寻找“黑色矩形”的原因,我两次阅读了每个关于“UICollectionView”和“黑色”的 SO 条目,并且有 许多仍未得到答复。选择最近的这个问题:在 IB/XIB、故事板、UICollectionView 的属性检查器中,向下滚动到视图部分,将背景从默认更改为另一种颜色,然后重建。 我得出的结论是,在第一次测试 UICollectionView 以查看是否可以使用默认标签(黑色文本)和可能的默认图像(可能尚未为其分配实际图像,或者可能是深色或透明的)时,经常发生这种情况) 在 UICollectionViewCell 中,模拟器显示黑色矩形,因此当问题是简单图形时,您可以断定新代码已损坏。
【讨论】:
以上是关于UICollectionView 单元内部已加载,但 UICollectionView 未显示的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView 单元格在可见时不断重新加载
在 UICollectionView 的底部添加额外的单元格
下载内部图像后调整 UICollectionView 单元格的大小