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?
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é. –
Suppongo che il delegato sia la soluzione migliore di qualsiasi ... visto che l'oggetto verrà comunque distrutto. –