Why does using headerReferenceSize with self-sizing cells in a collection view cause a crash in iOS 8?
Asked Answered
D

1

13

I managed to figure out the approach for self-sizing collection view cells under iOS 8.

I want to do this as a part of a accessory view.

I get a crash ... the interesting part of the stacktrace is as follows:

** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(
  0   CoreFoundation    __exceptionPreprocess + 165
  1   libobjc.A.dylib   objc_exception_throw + 45
  2   CoreFoundation    -[__NSArrayM insertObject:atIndex:] + 954
  3   UIKit             -[UICollectionViewFlowLayout layoutAttributesForElementsInRect:] + 384
  4   UIKit             __45-[UICollectionViewData validateLayoutInRect:]_block_invoke + 144
  5   UIKit             -[UICollectionViewData validateLayoutInRect:] + 1396
  6   UIKit             -[UICollectionView layoutSubviews] + 170
  7   UIKit             -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 521
  8   QuartzCore        -[CALayer layoutSublayers] + 150
  9   QuartzCore        _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
  10  UIKit             -[UIView(Hierarchy) layoutBelowIfNeeded] + 611
  11  UIKit             -[UIInputSetHostView layoutIfNeeded] + 105
  12  UIKit             __43-[UIInputWindowController setInputViewSet:]_block_invoke + 112
  13  UIKit             +[UIView(Animation) performWithoutAnimation:] + 65
  14  UIKit             -[UIInputWindowController setInputViewSet:] + 291
  15  UIKit             -[UIInputWindowController performOperations:withAnimationStyle:] + 50
  16  UIKit             -[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:] + 1054
  17  UIKit             -[UIResponder becomeFirstResponder] + 468
  18  UIKit             -[UIView(Hierarchy) becomeFirstResponder] + 99
  19  UIKit             -[UITextView becomeFirstResponder] + 75
  ...

This looks like an Apple bug. Why does the layout seem to return an empty layout attribute?

Debacle answered 23/8, 2014 at 9:9 Comment(13)
I had the same issue a few days ago , you could try to delete the derived data then rebuild.Walkway
Unfortunately that's not helped.Debacle
I have isolated the problem to the way that I'm using the header... still. So baffling.Debacle
If I set up a header with some fixed item size, it works fine. If I use estimatedItemSize instead, then this error happens. My conclusion is that estimatedItemSize works but just not with headerReferenceSizeDebacle
Have you filed a radar for this?Selfsealing
Did anyone ever manage to find a workaround for this? I'm unable to use headers with self sizing layouts as things stand. @fatuhoko, when you say "If I set up a header with some fixed item size, it works fine" - how are you doing that?Dewclaw
What I meant was, if you forget about using estimatedItemSize to self-size cells altogether, and just size cells by setting the itemSize property instead, then you headers work. i.e. the old functionality of using either the property, or overriding itemSizeForIndexPath or whatever it is, still works.Debacle
just had the same experience. As you indicated, it works for me if the section header is not being used. Did you set up a radar, so that we at least can hope?Eniwetok
Same behaviour for me.Nancienancy
Have anyone found a workaround for this?Northcutt
Is there some other way to hack a header or footer into a uicollectionview with self-sizing cells?Sunk
For what it's worth. This appears to have been fixed in iOS 8.3. However, is still a problem in iOS < 8.3.Yiyid
Hmm, I'm still getting this issue in iOS 8.4, but not in iOS 9.Glance
S
1

The best idea I have so far is based on this repository: https://github.com/algal/SelfSizingCellsDemo

On line 50 of ViewController.swift we have label.preferredMaxLayoutWidth = 320 which produces a cell that fills the whole screen and wraps the lines if there is enough text. This would need to be changed to fit whatever size screen you are working with. Then after each section you would need to add enough text to fill that label like is done on line 20 let items = smallitems.componentsSeparatedByString(" ") + [onelongitem]

The problem with this approach is that I don't yet know how I would put different views in that cell, besides text. This might work enough for your situation though.

Sunk answered 28/2, 2015 at 16:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.