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 导航栏闪烁

下载内部图像后调整 UICollectionView 单元格的大小

如果在重新加载期间触摸单元格,则重新加载后无法选择 UICollectionView 单元格

UICollectionView 仅重新加载第一个单元格