Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IOS UICollectionView在使用两个集合视图时抛出断言_Ios_Objective C_Uicollectionview_Uicollectionviewcell - Fatal编程技术网

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

IOS UICollectionView在使用两个集合视图时抛出断言,ios,objective-c,uicollectionview,uicollectionviewcell,Ios,Objective C,Uicollectionview,Uicollectionviewcell,我在一个UIViewController中有两个UICollectionView。我用标记号将它们分开,这样我就可以使用数据源和委托方法来处理这两个问题。但是,当我运行代码时,它会崩溃,出现以下异常: 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UICollectionView接收到索引路径不存在的单元格的布局属性:{length=2,path=0-1}” 我在论坛上查到了这一点,大多数人说你需要使UIControllerView无

我在一个UIViewController中有两个UICollectionView。我用标记号将它们分开,这样我就可以使用数据源和委托方法来处理这两个问题。但是,当我运行代码时,它会崩溃,出现以下异常:

由于未捕获的异常“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)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;
}

接受@Paulw的好建议如下:

@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;
    }
}
在任何地方都可以使用它,比如

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

这里有一些证据表明,您的
numberOfItemsInSection
在底部的无意义
return 1
,其中一个数组有0个元素。不要使用标记。只需将每个集合视图存储为属性,然后将收到的collectionview参数与该属性进行比较,以确定要询问的集合视图。这包括您的问题。希望有帮助…我如何使用方便的方法来处理-(UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath,其中一个数组包含UIImage对象和其他子对象?在条件之前使用方便的方法获取数组。然后在indexPath.row处引用数组,并在每个分支中适当地强制转换该元素。在进行建议的更改后仍然会发生相同的崩溃添加异常断点以标识行。大约一小时后,我将再次在一台开发机器上,我设置了一个异常断点,但它没有显示行。。它仍然在主干道中断。