У меня есть контроллер навигации, его контроллер корневого представления имеет тип 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: и как его можно остановить?