【问题标题】:UICollectionView received layout attributes for a cell in ios 7UICollectionView 在 ios 7 中接收到单元格的布局属性
【发布时间】:2023-03-23 17:26:01
【问题描述】:

我在我的应用程序上使用自定义 UICollectionView。但是,我有一个问题导致我的应用程序崩溃。崩溃日志:
注意:iOS 8 上不会出现此错误

2015-05-29 11:49:26.316 app9to5[1834:607] Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView recieved layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0x7fca0e00> {length = 2, path
= 0 - 14}'

> First throw call stack: (  
       CoreFoundation                      0x039b61e4 __exceptionPreprocess + 180  
       libobjc.A.dylib                     0x036808e5 objc_exception_throw + 44  
       CoreFoundation                      0x039b6048 +[NSException raise:format:arguments:] + 136  
       Foundation                          0x016954de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116  
       UIKit                               0x02be0866 __45-[UICollectionViewData validateLayoutInRect:]_block_invoke + 1793  
       UIKit                               0x02bdfaed -[UICollectionViewData validateLayoutInRect:] + 1376  
       UIKit                               0x02ba5603 -[UICollectionView layoutSubviews] + 173  
       UIKit                               0x025c8964 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355  
       libobjc.A.dylib

请帮我解决。非常感谢!

【问题讨论】:

  • 你能给我一些你的代码,特别是你的布局属性设置函数和你的collectionview委托吗?
  • @EugeneNguyen:您可以在链接gist.github.com/cuong-nguyen-ta/5b7f73f2fb9a316ffcf5 中查看此代码,我认为它发生在我打电话给[self.collectionView reloadData];
  • @EugeneNguyen 这是功能设置布局属性gist.github.com/cuong-nguyen-ta/22f6d7c5039d3743a4f1请帮我解决。非常感谢!
  • 有关此错误的更多信息。我在日志屏幕中看到 015-05-29 19:57:18.772 app9to5[2464:607] *** Assertion failure in -[UICollectionViewData validateLayoutInRect:], /SourceCache/UIKit_Sim/UIKit-2935.137/UICollectionViewData.m:357 /跨度>
  • 您应该检查布局约束出口。约束出口之一可以为零。

标签: ios objective-c ios7 uicollectionview


【解决方案1】:

你应该试试这个:

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect 你把这个:

for(NSInteger i=0 ; i < self.collectionView.numberOfSections; i++) {
    for (NSInteger j=0 ; j < [self.collectionView numberOfItemsInSection:i]; j++) {
        NSIndexPath* indexPath = [NSIndexPath indexPathForItem:j inSection:i];
        [attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]];
    }
}

希望这会有所帮助。

【讨论】:

  • @Nghia 您正在返回所有属性,而不仅仅是与指定矩形相交的属性
【解决方案2】:

在集合视图上调用 reloadData 之前尝试使布局无效。

[self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView reloadData];

【讨论】:

  • 我试过[self.collectionView.collectionViewLayout invalidateLayout]; 但是,它不起作用。 @@ 感谢您的评论。
  • 完美运行。很多答案都建议我创建一个新的collectionviewlayout,老实说这似乎过分了。使用 2 个集合视图时,此答案对我有用。谢谢
【解决方案3】:

或者你可以这样做

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    self.collectionView.collectionViewLayout.invalidateLayout()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2017-05-07
    相关资源
    最近更新 更多