将 UICollectionView 添加到 UIView

Posted

技术标签:

【中文标题】将 UICollectionView 添加到 UIView【英文标题】:Add UICollectionView to a UIView 【发布时间】:2016-07-16 19:56:33 【问题描述】:

我已尝试搜索与此问题相关的 Stack Overflow 问题,但似乎无法理解我做错了什么。我有一个 UIView 这是一个 xib。我将其用作地图注释标注。我想在这个标注 xib 中有一个UICollectionView。因此,我在 xib 中添加了UICollectionView,因为当它在UIView 内部时,它不允许将单元格添加到 UICollectionView 上,因此我为单元格创建了自己的类,并为单元格创建了 xib。

我一直在与'*** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:]'. 崩溃

我目前有我的UIView 作为 collectionView 的数据源和委托。

提前致谢。

 //UIView
 **MapAnnotationCallout.m File**

    -(id)initWithFrame:(CGRect)frame 

 //'mediaPreviewCell' is my custom cell
[_mediaCollectionView registerNib:[UINib nibWithNibName:@"MediaPreviewCell" bundle:nil] forCellWithReuseIdentifier:@"mediaCell"];

_mediaCollectionView.backgroundColor = [UIColor clearColor];

self = [super initWithFrame:frame];
if (self) 

    _previewImages = [[NSMutableArray alloc]initWithObjects:[UIImage imageNamed:@"belleIsle-1"], [UIImage imageNamed:@"belleIsle-2"], [UIImage imageNamed:@"old_english_D"], nil];

    [[NSBundle mainBundle]loadNibNamed:@"MapAnnotationCalloutView" owner:self options:nil];

    self.bounds = _view.bounds;

    [self addSubview:_view];


return self;


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
return [_previewImages count];


- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 

return CGSizeMake(80, 80);


- (MediaPreviewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

 *******crashing on this line with exception breakpoint************

MediaPreviewCell *cell = [_mediaCollectionView dequeueReusableCellWithReuseIdentifier:@"mediaCell" forIndexPath:indexPath];

 ******************************************    

cell.cellImage.image = [_previewImages objectAtIndex:indexPath.item];

return cell;


【问题讨论】:

你看到了吗? ***.com/a/12600019/5716449 @Ro4ch 感谢您的回复。是的,我做到了。我在 initWithFrame 方法中注册了笔尖。 失败的断言是什么? 为什么会有人说self.bounds = _view.bounds; [self addSubview:_view];?超视图的边界调整为子视图的边界?????? @matt 嘿,第一次这样做,但我遵循的教程给出的解释是 _view.bounds 是从我拥有的 xib 文件中加载的内容,这有助于在自定义 UIView 中定位我的视图,例如我的标签、UIImageViews 等。您有更好的解释或建议吗? 【参考方案1】:

我发现了问题所在。在为地图标注加载笔尖之前,我正在为 UICollectionViewCell 注册笔尖。因此,它试图在建立包含 UICollectionView 的标注之前创建单元格并将其放入 UICollectionView 中。此外,我在单元格上为我的 UIImageView 连接了一个插座,并试图以这种方式设置图像。相反,我只是给 imageView 一个标签,并在 'cellForItemAtIndexPath' 方法中使用该标签设置图像。现在效果很好。

-(id)initWithFrame:(CGRect)frame 

self = [super initWithFrame:frame];
if (self) 

     _previewImages = [[NSMutableArray alloc]initWithObjects:[UIImage imageNamed:@"belleIsle-1"], [UIImage imageNamed:@"belleIsle-2"], [UIImage imageNamed:@"old_english_D"], nil];

    [[NSBundle mainBundle]loadNibNamed:@"MapAnnotationCalloutView" owner:self options:nil];

    [_mediaCollectionView registerNib:[UINib nibWithNibName:@"MediaPreviewCell" bundle:nil] forCellWithReuseIdentifier:@"mediaCell"];


    _mediaCollectionView.backgroundColor = [UIColor clearColor];

    self.bounds = _view.bounds;

    [self addSubview:_view];

   
  return self;



- (MediaPreviewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

MediaPreviewCell *cell = [_mediaCollectionView dequeueReusableCellWithReuseIdentifier:@"mediaCell" forIndexPath:indexPath];

UIImageView *mediaImageView = (UIImageView *)[cell viewWithTag:100];

mediaImageView.image = [_previewImages objectAtIndex:indexPath.item];

return cell;

【讨论】:

以上是关于将 UICollectionView 添加到 UIView的主要内容,如果未能解决你的问题,请参考以下文章

将 UICollectionView 添加到 NavigationBar

如何将 UICollectionView 添加到 inputAccessoryView

将 UICollectionView 添加到 UIView

将平移手势添加到 UICollectionView 单元 - IOS/Swift

UICollectionView:将单击手势识别器添加到补充视图

将 UIButton 添加到 UICollectionView 标头