IOS UICollectionView在使用两个集合视图时抛出断言
我在一个UIViewController中有两个UICollectionView。我用标记号将它们分开,这样我就可以使用数据源和委托方法来处理这两个问题。但是,当我运行代码时,它会崩溃,出现以下异常:IOS UICollectionView在使用两个集合视图时抛出断言,ios,objective-c,uicollectionview,uicollectionviewcell,Ios,Objective C,Uicollectionview,Uicollectionviewcell,我在一个UIViewController中有两个UICollectionView。我用标记号将它们分开,这样我就可以使用数据源和委托方法来处理这两个问题。但是,当我运行代码时,它会崩溃,出现以下异常: 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UICollectionView接收到索引路径不存在的单元格的布局属性:{length=2,path=0-1}” 我在论坛上查到了这一点,大多数人说你需要使UIControllerView无
由于未捕获的异常“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处引用数组,并在每个分支中适当地强制转换该元素。在进行建议的更改后仍然会发生相同的崩溃添加异常断点以标识行。大约一小时后,我将再次在一台开发机器上,我设置了一个异常断点,但它没有显示行。。它仍然在主干道中断。