[UICollectionView setCollectionViewLayout:animated:] 访问错误

2024-02-08

我的 UICollectionView 发生了奇怪的崩溃。 崩溃的 UICollectionView 嵌入到另一个 UICollectionView 的 UICollectionView 单元格中。

我无法重现这个问题,如果内部 UICollectionView 是新初始化的,有时似乎会发生这种情况,因为外部 CollectionView 正在重新加载它的单元格。




com.apple.main-thread Crashed
0   libobjc.A.dylib     objc_msgSend + 9
1   UIKit   -[UICollectionViewData _setLayoutAttributes:atGlobalItemIndex:] + 60
2   UIKit   __45-[UICollectionViewData validateLayoutInRect:]_block_invoke_0 + 668
3   UIKit   -[UICollectionViewData validateLayoutInRect:] + 1408
4   UIKit   -[UICollectionViewData layoutAttributesForElementsInRect:] + 82
5   UIKit   -[UICollectionView setCollectionViewLayout:animated:] + 1644
6   MyApp   BSCTopnewsCollectionView.m line 52 -[BSCTopnewsCollectionView setupBSCTopnewsCollectionView]
7   MyApp   BSCTopnewsCollectionView.m line 27 -[BSCTopnewsCollectionView setWeakDelegatePointer:]
8   Myapp   BSCFrontPageViewController.m line 550 -[BSCFrontPageViewController collectionView:cellForItemAtIndexPath:]
9   UIKit   -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:] + 252
10  UIKit   -[UICollectionView _updateVisibleCellsNow:] + 2672
11  UIKit   -[UICollectionView layoutSubviews] + 214
12  UIKit   -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 258
13  QuartzCore  -[CALayer layoutSublayers] + 214
14  QuartzCore  CA::Layer::layout_if_needed(CA::Transaction*) + 460
15  QuartzCore  CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 16
16  QuartzCore  CA::Context::commit_transaction(CA::Transaction*) + 238
17  QuartzCore  CA::Transaction::commit() + 316
18  QuartzCore  CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 60
19  CoreFoundation  __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
25  UIKit   UIApplicationMain + 1120
26  MyApp   main.m line 16 main 


Exception Type:
    EXC_BAD_ACCESS
Code:
    KERN_INVALID_ADDRESS at 0x158848 
  

我在 setupBSCTopnewsCollectionView 的第 52 行中所做的是



BSCInfiniteLayout *infiniteLayout = [[BSCInfiniteLayout alloc] init];    

(line 52) self.collectionView.collectionViewLayout = infiniteLayout;
  


Edit: -[BSCFrontPageViewController collectionView:cellForItemAtIndexPath:]
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    if([collectionView isEqual:self.collectionView])
    {
        if(indexPath.row == 0) // Header Cell
        {
            BSCTopnewsCollectionView *cell = [collectionView dequeueReusableCellWithReuseIdentifier:BSCHeaderReuseIdentifier forIndexPath:indexPath];
            cell.dataSource = self;
            cell.weakDelegatePointer = self;

            self.topNewsCollectionView = cell;

            return cell;
        }
        else
        {
            //create normal cells
        }
    }
    else if ([collectionView isEqual:self.topNewsCollectionView.collectionView])
    {
        BSCTopNewsHeaderCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:BSCTopNewsCellReuseIdentifier forIndexPath:indexPath];
        BSCNews *topnews = [self.topNews objectAtIndex:indexPath.row];

        [cell setEntity:topnews];

        return cell;
    }
}

对那里的方法调用进行一些说明:

- (void)setWeakDelegatePointer:(BSCFrontPageViewController *)weakDelegatePointer
{
    _weakDelegatePointer = weakDelegatePointer;

    [self setupBSCTopnewsCollectionView];
    [self.collectionView reloadData];
}

- (void)setupBSCTopnewsCollectionView
{
    self.collectionView.delegate = self.weakDelegatePointer;
    self.collectionView.dataSource = self.weakDelegatePointer;

    BSCInfiniteLayout *infiniteLayout = [[BSCInfiniteLayout alloc] init];


    infiniteLayout.delegate = self;

    // Setup Layout
    self.collectionView.collectionViewLayout = infiniteLayout;
    self.collectionView.showsHorizontalScrollIndicator = NO;
    self.collectionView.pagingEnabled = YES;

    // Register Cells
    [self.collectionView registerNib:[UINib nibWithNibName:@"BSCTopNewsHeaderCell" bundle:nil] forCellWithReuseIdentifier:BSCTopNewsCellReuseIdentifier];
}


Edit3: The crash only seems to occur in special occasions. If the app was in the background, but still in memory and the user opens it up again. It then checks our API for new data, and if it found something will load them and reload the whole outer collectionView. Thats when the crash occurs.

如果在应用程序运行时重新加载 CollectionView 而不是一开始就在后台,一切都很好。


To make the setup a bit more clear.

首先,将 UICollectionView 拖放到 XIB 中的 ViewController,将 Delegate、数据源挂接到 ViewController(这只是主 ViewController)

不要为 1 个 CollectionView 使用 2 个不同的 nib 单元,因为您只能注册 1 个 Nib。最好使用 DecorationView 作为 HeaderView。创建新类 HeaderView :UICollectionReusableView。这个 UICollectionReusableView 是 UIView 的子类,可以在 UICollectionView 中与 UICollectionViewCell 一起重用。现在您可以注册这两种类型:

[self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:@"CELL"];
[self.collectionView registerNib:[UINib nibWithNibName:@"HeaderView" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderCell"];

接下来,将另一个 UICollectionView 拖到此 HeaderView 上,并与 HeaderView.h 中的 IBOutlet 挂钩。这里最好将Delegate、DataSource设置到这个类来进行控制。还要注册此 CollectionView 将使用的 Nib Cell。在 awakeFromNib 中执行,因为您之前注册了Nib

- (void)awakeFromNib{
    [self.topCollectionView registerNib:[UINib nibWithNibName:@"TopCell" bundle:nil] forCellWithReuseIdentifier:@"TopCell"];

    [self.topCollectionView setDataSource:self];
    [self.topCollectionView setDelegate:self];
}

如果您将数据源存储在外部,只需创建另一个属性并分配给它,然后在此处用于返回内部数据源,它就会工作得很好。

如果您想知道何时单击标题视图内的单元格,请使用自定义委托协议在单击 HeaderCell 时将委托发送到 ViewController。

这是我的代码,希望您理解并可以在这里应用您的数据:

https://github.com/lequysang/gitfiles02/blob/master/CollectionViewWithDecorationView.zip https://github.com/lequysang/gitfiles02/blob/master/CollectionViewWithDecorationView.zip

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[UICollectionView setCollectionViewLayout:animated:] 访问错误 的相关文章

  • SQLite。无法添加超过 1000 行

    我试图向我的 SQLite 数据库 使用 fmdb 添加 10k 行 但写入在 1000 行处停止 我没有任何错误或警告 我的代码 NSString queryString NSString stringWithFormat insert
  • xcode ios HMAC SHA 256 哈希

    所以我试图弄清楚如何在 ios 上执行 hmacshad256 哈希 因为这是我为我制作的 wcf 服务 api 所做的哈希 我一直在尝试寻找有关它的一些信息 但通常最终只会得到 SHA 256 哈希值 这是我唯一的参考资料 需要像在 Ja
  • 如何在 viewDidLayoutSubviews 中获得正确的视图高度?

    void viewDidLayoutSubviews super viewDidLayoutSubviews NSLog viewDidLayoutSubviews view height f self view frame size he
  • Morphic 中的 Morph 和 Cocoa 中的 NSView 有什么区别?

    我想了解 Morphic 的独特之处 Morphic 比 NSView 或任何其他graphics类只允许重新实现一组有限的功能 Morphic 是一个可塑性极强的 UI 构建工具包 Morphic 背后的一些设计理念明确了这一意图 包括一
  • 具有编程调整大小的自动布局 UIImageView 不遵循约束

    抱歉打扰 但我正在尝试延迟加载多个 imageView 然后根据 UITableView 中的内容按比例调整其大小 我也在尝试 也许不明智 基本上是第一次使用自动布局 我不明白为什么这些限制在这种情况下不起作用 这是我在将正确的图像加载到
  • 从另一个视图控制器删除表视图的一行

    我是 iOS 新手 我需要通过单击视图中的按钮从另一个视图 detailviewcontroller 中删除 tabelView 位于 tableviewcontoller 中的一行 谁能用 Objective C 语言解释一下 看一下所以
  • 更改 Tapku 日历上标记日期的所选图像

    你好 我浏览过网络和许多博客 但似乎没有关于如何更改tapku日历控件标记日期的图像的信息 我对代码做了一些研究 但无法完成目标 现在写 我能够更改日期图块的背景图像 但是当我这样做时 日期的文本消失了 有什么想法吗 我已经更改了上面的图像
  • 如何从 iPhone 直播视频 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想开发 iPhone 应用程序来将实时视频播放到网络上 Ustream 有从 iPhone 向网络广播的应用程序 有什么建议吗 我应该使
  • 在iOS中生成范围内的随机数? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试让随机数生成器在 iPho
  • iPhone - dequeueReusableCellWithIdentifier 用法

    我正在开发一个 iPhone 应用程序 它有一个相当大的 UITableView 其中的数据来自网络 所以我正在尝试优化它的创建和使用 我发现dequeueReusableCellWithIdentifier非常有用 但是在看到很多使用它的
  • UITableView 与 UILabel SizeToFit 滚动时会变得混乱

    大家好 我有问题tableview 我用uilabel with SizeToFit然后计算UILabel设置单元格高度的高度一切正常 除了当我滚动我的tableView文本变得很奇怪 就像每行一个字符 My TableViewVell方法
  • Swift 3 按钮文本自动调整大小

    因此 我有根据设备自动调整大小的按钮 我想知道如何使按钮文本自行调整大小 就像具有最小尺寸或比例的 UILable 一样 正如 Matt 上面所说的 UIButton 标题是通过 UILabel 显示的 您可以使用 minumScaleFa
  • Objective C:以编程方式创建 UIImageView

    我正在尝试制作一个 UIImageView 在单击按钮时将 png 加载到按钮的位置 brickAnim UIImageView alloc freezes during runtime brickAnim initWithFrame cu
  • IOS:触摸 Imageview 时的事件

    我有一个带有 png 的 ImageView 我想这样做 当有人触摸这个 imageview 时 它的 alpha 更改为 0 0 这可能吗 全部无按钮 您可以使用UITapGestureRecognizer添加到UIImageView v
  • 如何让付费版和免费版iOS应用共享FB App ID?

    我有同一个 iPhone 应用程序的免费版和付费版 我希望他们共享一个 Facebook 应用程序 ID 因为它们本质上是同一个应用程序 我认为我可以通过使用 Facebook 类中的这个方法来完成此任务 void authorize NS
  • 如何在 iOS 中屏蔽 UIView

    我见过类似的问题 但没有找到可行的答案 我想使用灰色图像屏蔽 UIView 需要转换为 alpha 比例进行屏蔽 UIView 有背景 屏蔽图像应该很容易 但我想屏蔽任何 UIView 任何线索将不胜感激 我已经研究这个问题几个小时了 并找
  • 如何在 iOS 中的电子邮件的 HTML 正文中嵌入图像

    我正在尝试在从 iPad 发送的 HTML 电子邮件的正文中包含图像 这似乎是不可能的 我尝试过使用 CID 方法 但似乎在 iOS 中无法获取 设置附件的 CID 我也尝试过将图像嵌入src data image png base64 b
  • iOS 中如何将阴影变成圆形?

    我创建了一个圆形 UIView 它也应该有一个阴影 到目前为止 一切正常 但在角落 阴影没有正确倒圆 如何将阴影角变圆 这是代码和屏幕截图 popupView layer cornerRadius 15 popupView layer sh
  • 方法未到达完成块

    我正在使用SKStoreProductViewController使用以下方法显示 iTunes 产品 该方法被调用 但我没有成功或错误 知道为什么吗 IBAction func BuySomething sender AnyObject
  • 如何使 RLMResults 可变?

    Realm 文档说RLMResults正在舔NSArray 我有一些从数据库返回的结果 我想将其合并到另一个RLMResults 但它似乎是一成不变的 如何制作RLMResults添加另一个对象RLMResults 或使其可变 或将其转换为

随机推荐