27

Ho un controller di navigazione, il suo controller di visualizzazione radice è di tipo CollectionViewControllerA. Selezionando una voce, ho uno sfumare e animazione seguita da una chiamata espansione per spingere una seconda vista controllore di tipo CollectionVewControllerB alla pila:UICollectionView calling scrollViewDidScroll: quando prelevato dallo stack di navigazione

CollectionViewControllerB *b = ... // construction of the view controller to be pushed 
[UIView animateWithDuration:.3 
       animations:^{ 
        self.collectionView.transform = CGAffineTransformMakeScale(1.5, 1.5); 
        self.collectionView.alpha = 0; 
       } 
       completion:^(BOOL s){ 
        [self.navigationController pushViewController:b animated:NO]; 
       }]; 

I pop controller della vista in modo simile

[UIView animateWithDuration:.3 
       animations:^{ 
        self.collectionView.transform = CGAffineTransformMakeScale(.3, .3); 
        self.collectionView.alpha = 0; 
       } 
       completion:^(BOOL s){ 
        [self.navigationController popViewControllerAnimated:NO]; 
       }]; 

Il problema qui è che l'app si arresta in modo anomalo quando si apre il controller di visualizzazione. Motivo:

*** -[CollectionViewControllerB scrollViewDidScroll:]: message sent to deallocated instance 

ho capito che il problema è perché il controller della vista spuntato è distrutto, ma perché scrollViewDidScroll: ottenere chiamato in primo luogo? Nulla cambia lo nel codice contentOffset e non c'è interazione dell'utente. A meno che la modifica della proprietà transform non attivi il metodo da richiamare?

CollectionViewControllerB strumenti scrollViewDidScroll: perché è necessario disabilitare lo scorrimento verticale.

Nel frattempo ho un trucco molto molto disordinato per evitare l'incidente, che è prima che l'animazione, aggiungo

self.collectionView.delegate = nil; 

Questo arresta il metodo di ottenere chiamato. Ma deve esserci un modo migliore.

Qualcuno può far luce sul motivo per cui si chiama scrollViewDidScroll: e come può essere fermato?

+0

Ho appena incontrato lo stesso problema, ma utilizzando segues. La mia soluzione era uguale alla tua; alla vista WillDisappear nil out the delegate. Non ho idea del perché questo accada. Deve essere il caso che in qualche modo popping cambi il contentOffset, ma non sono sicuro di come o perché. –

+0

Suppongo che il delegato sia la soluzione migliore di qualsiasi ... visto che l'oggetto verrà comunque distrutto. –

risposta

56

Sembra che l'unico modo per risolvere il problema sia quello che ho già fatto ... impostando il delegato su nil prima dell'animazione.

self.collectionView.delegate = nil; 

Speriamo che questo aiuti qualcun altro in futuro.

+9

L'ho aggiunto in - (void) metodo dealloc. – mishimay

+0

@md_develop che è il posto migliore per metterlo –

+3

Ho appena avuto questo mi è successo con un UITableView. Non ho idea del perché, ma impostare il delegato su zero l'ha risolto. Tuttavia, per qualche motivo, sembra un trucco. – Johnny

9

Impostare self.automaticallyAdjustsScrollViewInsets = NO; all'interno del controller di visualizzazione.

Avevo un problema simile a questo, e ho scoperto che navigando lontano dalla pagina, lo contentOffset cambiava di 20 ogni volta.

Ho scoperto che l'impostazione di questa proprietà all'interno del mio controller di visualizzazione ha smesso di cambiare e quindi scrollViewDidScroll non è stato più chiamato. Risulta che il controller di visualizzazione regola automaticamente le impostazioni di contenuto per le modifiche nella barra di stato, nella barra di navigazione, ecc. Anche quando si naviga.

Penso che questa sia una soluzione migliore e una spiegazione adeguata del motivo per cui è stato chiamato il metodo di scorrimento.

+0

Per me, 'self.automaticallyAdjustsScrollViewInsets = NO;' ha causato il crash. Impostandolo su 'SÌ', risolto il problema. Questo è molto strano –

0

Puoi provare questo nel controller.

[self setEdgesForExtendedLayout:UIRectEdgeNone]; 

Spero che questo ti possa aiutare.

Problemi correlati