使用两个集合视图时,IOS UICollectionView会抛出断言

时间:2017-04-03 22:43:44

标签: ios objective-c uicollectionview uicollectionviewcell

我在一个UIViewController中有两个UICollectionView。我用标签号将它们分开,这样我就可以使用数据源和委托方法。但是,当我运行代码时,它会以异常:

崩溃

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView received layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0xc000000000200016> {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)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

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

    return 1;
}


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)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;
}

1 个答案:

答案 0 :(得分:2)

采取@Paulw的好建议如下:

createDropdown()

您的数据源方法必须充满信念,总是根据它们传递的集合视图划分条件的两个分支,并始终在一个中使用一个数据源数组,而在另一个中使用另一个数据源数组。

您可以通过方便的方法获取数据源来强制实施这种宗教信仰,例如......

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

随处使用,如......

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