UICollectionView使用自定义布局引发未捕获的异常

时间:2015-08-20 13:03:06

标签: ios objective-c uicollectionview

我正在使用自定义布局的集合视图,我第一次从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) {

                }

任何快速解决方案都会非常感激。谢谢

1 个答案:

答案 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,然后集合视图会强制它再次计算布局。