У меня есть контроллер навигации, его контроллер корневого представления имеет тип CollectionViewControllerA
. После выбора элемента у меня появляется постепенное уменьшение и расширение анимации, за которым следует вызов, чтобы вставить второй контроллер представления типа CollectionVewControllerB
в стек:
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];
}];
Я выхожу на контроллер вида аналогичным образом
[UIView animateWithDuration:.3
animations:^{
self.collectionView.transform = CGAffineTransformMakeScale(.3, .3);
self.collectionView.alpha = 0;
}
completion:^(BOOL s){
[self.navigationController popViewControllerAnimated:NO];
}];
Проблема заключается в том, что приложение вылетает при появлении контроллера вида. Причина:
*** -[CollectionViewControllerB scrollViewDidScroll:]: message sent to deallocated instance
Я понимаю, что проблема в том, что контроллер popped view уничтожен, но почему scrollViewDidScroll:
вызывается в первую очередь? Ничто не меняет contentOffset
кода collectionView
в коде, и нет никакого взаимодействия с пользователем. Если изменение свойства transform
также вызывает метод для вызова?
CollectionViewControllerB
реализует scrollViewDidScroll:
, потому что мне нужно отключить вертикальную прокрутку.
Между тем у меня очень очень грязный взломать, чтобы предотвратить сбой, то есть до анимации, я добавляю
self.collectionView.delegate = nil;
Это останавливает вызов метода. Но должен быть лучший способ.
Может ли кто-нибудь пролить свет на то, почему вызывается scrollViewDidScroll:
и как его можно остановить?