私はナビゲーションコントローラを持っています。そのルートビューコントローラはCollectionViewControllerA
です。項目を選択すると、私はフェードを有し、スタック型CollectionVewControllerB
の第2のビューコントローラをプッシュする呼び出しに続くアニメーションを拡大:UICollectionViewがscrollViewDidScrollを呼び出すとき:ナビゲーションスタックからポップされるとき
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は同様
[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:
は最初の場所で呼び出されますでしょうか?コード内でcollectionView
のcontentOffset
を変更するものはありません。また、ユーザーの操作もありません。 transform
プロパティを変更しない限り、呼び出されるメソッドがトリガされますか?
CollectionViewControllerB
は、scrollViewDidScroll:
を実装しています。これは、垂直スクロールを無効にする必要があるためです。
一方、私はクラッシュを防ぐために非常に非常に厄介なハックを持って、それがアニメーションの前で、私はこれはと呼ばれる取得からメソッドを停止し
self.collectionView.delegate = nil;
を追加します。しかし、よりよい方法が必要です。
誰でもscrollViewDidScroll:
が呼び出され、どのように停止することができるのかを明らかにすることはできますか?
私は同じ問題に直面しましたが、セグを使用しています。私の解決策はあなたと同じでした。 viewWillDisappearではデリゲートを除外します。なぜこのようなことが起こるのかわからない。何とかポップアップしてcontentOffsetを変更する必要がありますが、どうやって、なぜかわからないのです。 –
私は、デリゲートをnil-ingすることはどんな解決策でもあると思います...とにかくオブジェクトが破壊されるのを見ています。 –