ナビゲーションコントローラーがあり、そのルートビューコントローラーのタイプはCollectionViewControllerA
です。項目を選択すると、フェード アウトと展開のアニメーションが表示され、その後に次のタイプの 2 つ目のビュー コントローラーを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];
}];
同様の方法でView Controllerをポップします
[UIView animateWithDuration:.3
animations:^{
self.collectionView.transform = CGAffineTransformMakeScale(.3, .3);
self.collectionView.alpha = 0;
}
completion:^(BOOL s){
[self.navigationController popViewControllerAnimated:NO];
}];
ここでの問題は、View Controller をポップするときにアプリがクラッシュすることです。理由:
*** -[CollectionViewControllerB scrollViewDidScroll:]: message sent to deallocated instance
scrollViewDidScroll:
ポップされたView Controllerが破棄されていることが問題であることは理解していますが、そもそも呼び出されるのはなぜですか? contentOffset
コード内は何も変更collectionView
されず、ユーザーの操作もありません。transform
プロパティを変更してもメソッドが呼び出されない限り?
CollectionViewControllerB
scrollViewDidScroll:
垂直スクロールを無効にする必要があるため、実装します。
その間、アニメーションの前に、クラッシュを防ぐための非常に厄介なハックがあります。
self.collectionView.delegate = nil;
これにより、メソッドが呼び出されなくなります。しかし、もっと良い方法があるはずです。
scrollViewDidScroll:
なぜ呼び出され、どのように停止できるのかについて、誰かが光を当てることができますか?