27

ナビゲーションコントローラーがあり、そのルートビューコントローラーのタイプは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プロパティを変更してもメソッドが呼び出されない限り?

CollectionViewControllerBscrollViewDidScroll:垂直スクロールを無効にする必要があるため、実装します。

その間、アニメーションの前に、クラッシュを防ぐための非常に厄介なハックがあります。

self.collectionView.delegate = nil;

これにより、メソッドが呼び出されなくなります。しかし、もっと良い方法があるはずです。

scrollViewDidScroll:なぜ呼び出され、どのように停止できるのかについて、誰かが光を当てることができますか?

4

3 に答える 3

56

問題を解決する唯一の方法は、私がすでに行ったことのようです...アニメーションの前にデリゲートをnilに設定します。

self.collectionView.delegate = nil;

うまくいけば、これは将来誰かを助けるでしょう。

于 2013-07-25T05:07:18.333 に答える
9

self.automaticallyAdjustsScrollViewInsets = NO;ビューコントローラー内に設定します。

これに似た問題があり、ページから移動するcontentOffsetたびに が 20 ずつ変化することがわかりました。

ビューコントローラー内でこのプロパティを設定すると、この変更が停止したため、scrollViewDidScroll呼び出されなくなりました。ビューコントローラーは、ステータスバー、ナビゲーションバーなどの変更に合わせてコンテンツインセットを自動的に調整することがわかりました。

これは、スクロールメソッドが呼び出された理由についてのより良い解決策であり、適切な説明だと思います。

于 2014-12-02T15:11:40.593 に答える
0

controller でこれを試すことができます。

[self setEdgesForExtendedLayout:UIRectEdgeNone];

これがお役に立てば幸いです。

于 2016-04-15T05:02:32.087 に答える