我正在使用自定义布局的集合视图,我第一次从API收到的调用webservice返回20个对象,第二次它将返回1个对象,而重新加载数据应用程序会引发以下错误。
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:UICollectionView接收带索引的单元格的布局属性 不存在的路径:{length = 2,path = 0 - 0}
创建新布局的代码片段
try {
PrintWriter out = new PrintWriter(new BufferedWriter( new FileWriter("D:\\LOL\\" + choice.getSelectedItem() + "\\KDA.txt", true)));
FileReader fr = new FileReader("D:\\LOL\\" + choice.getSelectedItem() + "\\KDA.txt");
BufferedReader br = new BufferedReader(fr);
String suma ;
while(br.readLine() != null){
Integer.parseInt(suma);
suma = 0; //type mismatch: cannot convert from int to String
suma += Double.parseDouble(br.readLine());
textField_4.setText(suma);
}
} catch (Exception e2) {
}
任何快速解决方案都会非常感激。谢谢
答案 0 :(得分:1)
有些事情需要考虑,因为您是自定义布局,然后您需要为每个indexPath创建layoutAttribute。在您的情况下,您的数据源数组计数和offerModel.arrayOffers
以及self.pendingLayoutAttributes
应该相同,否则可能会出现问题,如果offerModel.arrayOffers
有更多项目,那么可能会出现问题self.pendingLayoutAttributes
如果要加载数据异步,请确保在arrayOffers中添加行时还要在customLayout pendLayoutAttributes
中添加layoutAttributes,我认为您目前没有这样做,通过添加方法并提供新方法来实现indexPaths
创建layoutAttributes
。
我通常喜欢这个
- (void)insertItems:(NSArray*)items
{
NSInteger startIndex = <start index for new item>;
[self.items addObjectsFromArray:items];
[self calculateLayoutForItems:items startIndex:startIndex];
}
此方法将计算layoutAttributes
- (void)calculateLayoutForItems:(NSArray*)items startIndex:(NSInteger)startIndex
{
// collection view and loop over them as well and nest indexPath creation
NSInteger section = 0;
NSInteger endIndex = self.items.count;
// Lets create indexPaths for provided items and get there frames
for (NSInteger index = startIndex ;index < endIndex; index++)
{
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:index inSection:section];
CGRect frame = [self frameForItemAtIndexPath:indexPath];// call your method for frame at indexPath
UICollectionViewLayoutAttributes *itemAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
itemAttributes.frame = frame;
self.pendingLayoutAttributes[indexPath] = itemAttributes; // you can use your index
}
}
现在,当您在数据源中有更多项目时,请在customLayoutObject [self.customLayout insertItems:newItemsArray];
上调用此方法
此外,如果您已经存储了属性,那么它的值可以覆盖自定义布局中的invalidate方法,将所有属性重置为初始状态,然后
您可以在invalidate
方法之前customLayout
reloadData
,然后集合视图会强制它再次计算布局。