Errore di asserzione in UICollectionViewData validateLayoutInRect su ios7

Errore di asserzione in UICollectionViewData validateLayoutInRect su iOS7.

Sto cercando di eliminare tutti UICollectionView elementi, uno per uno, utilizzando un for loop; ho postato il mio codice riportato di seguito. Eliminare i UICollectionView elementi utilizzando deleteItemsAtIndexPaths. È perfettamente funzionante su iOS6, ma si blocca in iOS7 con questa eccezione:

Errore di asserzione in UICollectionViewData validateLayoutInRect

Eliminare un oggetto da collectionArray poi self.collectionView, uno per uno, utilizzando indexPath. Quando si elimina il 4 ° oggetto solleva Assertion failure su iOS7. Qui sto usando performBatchUpdates.

Aiutarmi a ottenere il risultato corretto in iOS7. Condividere il codice corretto.
Grazie in anticipo.

try  {    
    for (int i=count-1; i>=0; i--)  {  
        [self.collectionView performBatchUpdates:^(void){  
            [collectionArray removeObjectAtIndex:i]; //First delete the item from you model   
            [self.collectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]]];  
        } completion:nil];
        [self.collectionView reloadData];
    }
}
@catch (NSException *exception) {
}
@finally {
}
  • sembra che tu abbia lo stesso problema come accennato in: stackoverflow.com/questions/18189311/… e stackoverflow.com/questions/18339030/…
  • Il primo è un crash quando si invia un messaggio ad un oggetto, mentre questo qui è un’eccezione generata da un errore di asserzione. Nessun tipo di relazione. Il 2 ° potrebbe essere correlato, ma non posso dire con certezza in quanto non è detto qui che viene generata un’eccezione, esattamente.

 

8 Replies
  1. 24

    Ho avuto questo problema una volta non perché ero di ritorno a zero per un numero di sezioni o articoli in una sezione, ma perché ero il riutilizzo di un layout di flusso come questo per più di 1 visualizzazione di raccolta:

    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
    Collection1 = [[UICollectionView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 50.0f) collectionViewLayout:flowLayout];
    [Collection1 setDataSource:self];
    [Collection1 setDelegate:self];
    [self.view addSubview:Collection1];
    
    Collection2 = [[UICollectionView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, self.view.frame.size.height) collectionViewLayout:flowLayout];
    Collection2.backgroundColor = [UIColor whiteColor];

    Invece se creo un nuovo layout di flusso per ogni UICollectionView evitare questo incidente. Spero che possa aiutare qualcuno

    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
    Collection1 = [[UICollectionView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 50.0f) collectionViewLayout:flowLayout];
    [Collection1 setDataSource:self];
    [Collection1 setDelegate:self];
    [self.view Collection1];
    
    UICollectionViewFlowLayout *flowLayoutVert = [[UICollectionViewFlowLayout alloc] init];
    [flowLayoutVert setScrollDirection:UICollectionViewScrollDirectionVertical];
    Collection2 = [[UICollectionView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, self.view.frame.size.height) collectionViewLayout:flowLayoutVert];
    • Io sto facendo la stessa cosa, ma senza alcun risultato.
    • Un grande aiuto. Salvare il mio di tonnellate di tempo.
    • Mi rende contento di scrivere alcune di queste cose quando in realtà aiuta qualcuno.
    • Vorrei poter votare! Grazie!
  2. 20

    in iOS 10, è necessario disabilitare il prefetchingEnabled:

    //Swift
    if #available(iOS 10, *) { 
        collectionView.prefetchingEnabled = false 
    }
    
    //Obj C
    if ([self.collectionView respondsToSelector:@selector(setPrefetchingEnabled:)]) {
        self.collectionView.prefetchingEnabled = false;
    }
    • Voi, signore, sono un risparmiatore di vita. Grazie. E ‘ davvero risolto il mio problema, come io sto usando una custom FlowLayout classe.
    • baci e hags
    • Devo aggiungere questo codice viewDidLoad() ?
    • iUser Si può fare o Con l’apertura di Attributo-ispettore di pan di storyboard per quel particolare collezione-vista da deselezionare il prefetch di proprietà.
  3. 3

    Sembra che probabilmente si desidera fare ciò:

    [self.CollectionView performBatchUpdates:^(void) {
      for (int i = count - 1; i >= 0; i--) {
        [collectionArray removeObjectAtIndex:i]; //First delete the item from you model
        [self.CollectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]]];
      }
    } completion:nil];

    In modo che tutti gli aggiornamenti sono eseguiti insieme. Altrimenti si finisce cercando di eseguire diversi un sacco di aggiornamenti batch sulla parte superiore di ogni altro.

  4. 3

    Errore di asserzione in UICollectionViewData validateLayoutInRect su ios7

    Si dovrebbe implementare invalidateLayout nel layoutClass e rimuovere tutti i tipi di UICollectionViewLayoutAttributes articoli nel tuo config.

    - (void)invalidateLayout{
      [super invalidateLayout];
      [self.itemsAttributes removeAllObjects];
    }
  5. 2

    provare a chiamare [yourCollectionView.collectionViewLayout invalidateLayout];

  6. 1

    Si dovrebbe implementare invalidateLayout nel layout di classe e di rimuovere tutti i tipi di UICollectionViewLayoutAttributes articoli nel tuo config.

    - (void)invalidateLayout{
      [super invalidateLayout];
      [self.itemsAttributes removeAllObjects];
    }

    Per un modo migliore per implementare invalidateLayoutWithContext, vedere di più su UICollectionViewLayoutInvalidationContext.

    Da Documentazione per gli Sviluppatori Apple:

    Per la realizzazione di un layout personalizzato, è possibile eseguire l’override di questo metodo e l’uso
    per l’elaborazione di informazioni fornite da un custom invalidazione contesto.
    Non è necessario fornire una custom invalidazione contesto, ma potrebbe
    se si è in grado di fornire ulteriori proprietà che possono aiutare
    ottimizzare il layout aggiornamenti. Se si esegue l’override di questo metodo, è necessario chiamare
    super ad un certo punto nella tua implementazione.

  7. -1
    - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
        [collectionView.collectionViewLayout invalidateLayout];
        return 1;
    }
    • Questo causa un overflow dello stack.

Lascia un commento