UICollectionView do not reuse cells

前端 未结 3 1178
花落未央
花落未央 2020-12-05 03:23

I am having trouble with reuse cells and UICollectionView on iOS 7. My code works fine on iOS 6 but in iOS 7 it does not reuse the cell after calling dequ

相关标签:
3条回答
  • 2020-12-05 03:38

    Update 2:
    It turns out that this answer is not correct. Please see the answer below or by clicking this link https://stackoverflow.com/a/20147799/814389 instead.


    Update

    So I have revisited this answer since as I have found out a little more about this bug..

    I grabbed all the devices I had available to me and ran the same tests on each one and these were the results:

    DEVICE          OS Version      CELL REUSE
    =============   =============   =============
    iPad 4          7.0.0           YES
    iPad 4          7.0.3           YES
    iPad 3          7.0.3           NO
    iPad 2          7.0.3           NO
    iPad Mini       7.0.0           YES
    iPad Mini       7.0.3           YES
    iPhone 5s       7.0.3           YES
    iPhone 4        7.0.2           YES
    iPhone 4        7.0.3           YES
    

    As you can see, it looks like for some reason cell reuse is not working on older iPads (ones that aren't capable of rendering the blurs).

    I initially thought that Apple may have just prevented reuse on older iPads due to some sort of performance issue but if that was to have made sense, the iPhone 4 would also show the same results.

    To get around this issue in my application, I have a NSMutableDictionary in my collectionViewController and I am storing my cells in there with the key being the indexPath.. In my case this is OK as I only have around 9 cells and their indexPaths never change but if you needed something more flexible then maybe it would be a good idea to checkout PSTCollectionView (https://github.com/steipete/PSTCollectionView)


    Just tested this out on a physical device.. and it seems to work fine on both iOS 7 and 6 but not iOS 7 Simulator!!!

    Just put some logs in the collectionView sample:

    @implementation Cell
    
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
        NSLog(@"%s",__func__);
        self = [super initWithCoder:aDecoder];
        if (self)
        {
            CustomCellBackground *backgroundView = [[CustomCellBackground alloc] initWithFrame:CGRectZero];
            self.selectedBackgroundView = backgroundView;
        }
        return self;
    }
    
    -(void)prepareForReuse
    {
        NSLog(@"%s",__func__);
    }
    
    -(void)dealloc
    {
        NSLog(@"%s",__func__);
    }
    
    @end
    

    Then scrolled to the bottom on all three devices and this was the output:

    iOS 7 Simulator

    2013-10-09 17:42:45.798 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:45.807 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:45.811 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:45.841 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:45.844 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:45.848 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:45.852 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:45.857 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.080 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.083 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.181 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.183 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.208 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.208 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.214 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.218 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.245 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.246 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.264 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.268 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.289 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.290 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.317 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.322 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.343 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.344 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.364 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.367 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.401 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.402 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.430 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.432 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.472 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.472 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.498 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.505 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.561 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.562 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.585 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.587 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.624 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.624 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.669 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.674 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.797 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.799 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.809 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.809 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.810 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.810 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.964 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.966 CollViewSmpl[9547:a0b] -[Cell initWithCoder:]
    2013-10-09 17:42:47.987 CollViewSmpl[9547:a0b] -[Cell dealloc]
    2013-10-09 17:42:47.987 CollViewSmpl[9547:a0b] -[Cell dealloc]
    

    iOS 6 Device (iPhone 5)

    2013-10-09 17:45:42.173 CollViewSmpl[187:907] -[Cell initWithCoder:]
    2013-10-09 17:45:42.191 CollViewSmpl[187:907] -[Cell initWithCoder:]
    2013-10-09 17:45:42.205 CollViewSmpl[187:907] -[Cell initWithCoder:]
    2013-10-09 17:45:42.217 CollViewSmpl[187:907] -[Cell initWithCoder:]
    2013-10-09 17:45:42.230 CollViewSmpl[187:907] -[Cell initWithCoder:]
    2013-10-09 17:45:42.242 CollViewSmpl[187:907] -[Cell initWithCoder:]
    2013-10-09 17:45:42.253 CollViewSmpl[187:907] -[Cell initWithCoder:]
    2013-10-09 17:45:42.264 CollViewSmpl[187:907] -[Cell initWithCoder:]
    2013-10-09 17:45:43.630 CollViewSmpl[187:907] -[Cell initWithCoder:]
    2013-10-09 17:45:43.640 CollViewSmpl[187:907] -[Cell initWithCoder:]
    2013-10-09 17:45:43.697 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:43.706 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:43.777 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:43.791 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:43.844 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:43.855 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:43.927 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:43.937 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:44.027 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:44.037 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:44.144 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:44.155 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:44.311 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:44.324 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:44.560 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:44.571 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:45.027 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:45.040 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:45.397 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:45.407 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:45.494 CollViewSmpl[187:907] -[Cell prepareForReuse]
    2013-10-09 17:45:45.503 CollViewSmpl[187:907] -[Cell prepareForReuse]
    

    iOS 7 Device (iPhone 5s)

    2013-10-09 17:44:37.603 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:38.015 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:38.029 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:38.037 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:38.045 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:38.053 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:38.061 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:38.071 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:39.470 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:39.483 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:39.535 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.540 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.583 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.587 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.633 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.637 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.683 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.688 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.733 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.737 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.783 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:39.791 CollViewSmpl[871:60b] -[Cell initWithCoder:]
    2013-10-09 17:44:39.866 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.870 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.933 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:39.938 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:40.033 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:40.036 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:40.149 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:40.152 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:40.300 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:40.304 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:40.650 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    2013-10-09 17:44:40.652 CollViewSmpl[871:60b] -[Cell prepareForReuse]
    

    You can tell that there have been some changes between reuse in iOS 6 and 7 because 1) It doesn't work in the simulator and 2) If you do a really fast scroll to begin with, the cells aren't initially ready for reuse so it has to create a new one to compensate where iOS 6 didn't (see my logs).

    There goes half of my day trying to fix a bug that only happens on the simulator.

    0 讨论(0)
  • 2020-12-05 03:41

    This is a known issue in iOS 7: http://openradar.appspot.com/15357491

    0 讨论(0)
  • 2020-12-05 03:52

    I was experiencing the same exact issue on my iPad 3 today (just one out of three iPad 3 I tested out), and I found out it is related to global Accessibility settings. The solution is to double check that every option in accessibility panel is disabled. I think that some options (like bigger fonts, for example) could stay enabled, but I haven't checked which one in details.

    Explanation

    Looking at the stack trace you can see this:

    #0  0x003121ce in -[MyCollectionViewCell initWithFrame:]
    #1  0x32f945ec in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:]
    #2  0x04466656 in -[UICollectionViewAccessibility(SafeCategory) _dequeueReusableViewOfKind:withIdentifier:forIndexPath:]
    #3  0x32f9414a in -[UICollectionView dequeueReusableCellWithReuseIdentifier:forIndexPath:]
    #4  0x001767cc in -[MyCollectionView collectionView:cellForItemAtIndexPath:]
    

    As you can see there is a call to -[UICollectionViewAccessibility(SafeCategory) _dequeueReusableViewOfKind:withIdentifier:forIndexPath:] that references something about Accessibility. So I went to Accessibility settings in Settings app, and I found out that my setting for Accessibility Shortcut was "switch control" instead of nothing. So I disabled it, I ran again the app and my stack trace now was fine:

    #0  0x00313658 in -[MyCollectionViewCell prepareForReuse]
    #1  0x32f942e6 in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:]
    #2  0x32f9414a in -[UICollectionView dequeueReusableCellWithReuseIdentifier:forIndexPath:]
    #3  0x001767cc in -[MyCollectionView collectionView:cellForItemAtIndexPath:]
    
    0 讨论(0)
提交回复
热议问题