• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

IOS UICollectionView 在使用两个 Collection View 时抛出断言

[复制链接]
菜鸟教程小白 发表于 2022-12-13 00:31:53 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我在一个 UIViewController 中有两个 UICollectionView。我用标签号分隔它们,以便我可以同时使用数据源和委托(delegate)方法。但是,当我运行代码时,它会因异常而崩溃:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UICollectionView 接收到具有不存在索引路径的单元格的布局属性: {length = 2, path = 0 - 1 }'.

我在论坛中查找了这个,大多数人说你需要使 UIControllerView 无效然后重新加载,但在我的情况下这不起作用。

有人知道如何解决这个问题吗?

这是我的代码:

-(void)viewDidLoad {

    self.socialMediaGrayIcons = [[NSMutableArray alloc] initWithObjects:[UIImage imageNamed"fb-gray.png"],
                            [UIImage imageNamed"twitter-gray.png"],
                            [UIImage imageNamed"insta-gray.png"],
                            [UIImage imageNamed"sms-gray.png"],
                            [UIImage imageNamed"email-gray.png"], nil];

    // setup collection view
    self.avatarCollectionView.tag = 200;
    self.socialMediaCollectionView.tag = 201;

    UINib *cellNib = [UINib nibWithNibName"NibCell" bundle:nil];
    [self.avatarCollectionView  registerNib:cellNib forCellWithReuseIdentifier"cvCell"];
    [self.socialMediaCollectionView  registerNib:cellNib forCellWithReuseIdentifier"smCell"];

    // setup collection view layout
    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
    [flowLayout setItemSize:CGSizeMake(40, 40)];
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];

    [self.avatarCollectionView setCollectionViewLayout:flowLayout];
    [self.socialMediaCollectionView setCollectionViewLayout:flowLayout];

    [self.avatarCollectionView reloadData];
    [self.avatarCollectionView.collectionViewLayout invalidateLayout];

    [self.socialMediaCollectionView reloadData];
    [self.socialMediaCollectionView.collectionViewLayout invalidateLayout];
}

....

#pragma mark UICollectionView DataSource and Delegate mathods
- (NSInteger)numberOfSectionsInCollectionViewUICollectionView *)collectionView
{
    return 1;
}

- (NSInteger)collectionViewUICollectionView *)collectionView numberOfItemsInSectionNSInteger)section
{
    if (collectionView.tag == 200)
    {
        return self.children.count;
    } else if (collectionView.tag == 201){
        return self.socialMediaGrayIcons.count;
    }

    return 1;
}


- (UICollectionViewCell *)collectionViewUICollectionView *)collectionView cellForItemAtIndexPathNSIndexPath *)indexPath
{
    UICollectionViewCell *cell;

    if (collectionView.tag == 200)
    {
        static NSString *cellIdentifier = @"cvCell";
        cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

        Child *currentChild = [self.children objectAtIndex:indexPath.row];


        UIImage *curImage = [UIImage imageWithData:currentChild.thumbnail];
        UIImageView *thumbView = (UIImageView *)[cell viewWithTag:100];

        if (curImage != nil)
        {
            [thumbView setImage:curImage];

        }
    } else if (collectionView.tag == 201){

        static NSString *cellIdentifier = @"smCell";
        cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

        UIImage *curImage = (UIImage*) [self.socialMediaGrayIcons objectAtIndex:indexPath.row];
        UIImageView *thumbView = (UIImageView *)[cell viewWithTag:101];

        if (curImage != nil)
        {
            [thumbView setImage:curImage];

        }
    }

    return cell;
}



Best Answer-推荐答案


采纳@Paulw 的好建议如下所示:

@property(weak,nonatomic) IBOutlet UICollectionView *collectionViewA;
@property(weak,nonatomic) IBOutlet UICollectionView *collectionViewB;

您的数据源方法必须严格按照传递的 Collection View 将条件划分为两个分支,并且始终在一个中使用一个数据源数组,在另一个中使用另一个。

您可以通过始终通过方便的方法获取数据源来强制执行此宗教,例如...

- (NSArray *)datasourceForCollectionViewUICollectionView *)collectionView {
    if (collectionView == self.collectionViewA) {
        return self.children;
    } else { // NOTICE - no else-if, there's no other valid condition
        return self.socialMediaGrayIcons;
    }
}

在任何地方都可以使用它,例如...

- (NSInteger)collectionViewUICollectionView *)collectionView numberOfItemsInSectionNSInteger)section {
    return [self datasourceForCollectionView:collectionView].count;
}

关于IOS UICollectionView 在使用两个 Collection View 时抛出断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43195498/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap