27

私はナビゲーションコントローラを持っています。そのルートビューコントローラは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:は最初の場所で呼び出されますでしょうか?コード内でcollectionViewcontentOffsetを変更するものはありません。また、ユーザーの操作もありません。 transformプロパティを変更しない限り、呼び出されるメソッドがトリガされますか?

CollectionViewControllerBは、scrollViewDidScroll:を実装しています。これは、垂直スクロールを無効にする必要があるためです。

一方、私はクラッシュを防ぐために非常に非常に厄介なハックを持って、それがアニメーションの前で、私はこれはと呼ばれる取得からメソッドを停止し

self.collectionView.delegate = nil; 

を追加します。しかし、よりよい方法が必要です。

誰でもscrollViewDidScroll:が呼び出され、どのように停止することができるのかを明らかにすることはできますか?

+0

私は同じ問題に直面しましたが、セグを使用しています。私の解決策はあなたと同じでした。 viewWillDisappearではデリゲートを除外します。なぜこのようなことが起こるのかわからない。何とかポップアップしてcontentOffsetを変更する必要がありますが、どうやって、なぜかわからないのです。 –

+0

私は、デリゲートをnil-ingすることはどんな解決策でもあると思います...とにかくオブジェクトが破壊されるのを見ています。 –

答えて

56

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

self.collectionView.delegate = nil; 

これは将来他の人に役立つことを望みます。

+9

私はそれを - (void)deallocメソッドに追加しました。 – mishimay

+0

@md_developはそれを置くのに最適な場所です –

+3

私はこれをUITableViewで私に起こしました。私はどうしていいのかわかりませんが、デリゲートをnilに設定するとそれが修正されました。しかし何らかの理由で、ハックのように感じます。 – Johnny

9

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

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

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

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

+0

私のために、 'self.automaticallyAdjustsScrollViewInsets = NO;'がクラッシュを引き起こした。 'YES'に戻して、問題を解決しました。これは非常に奇妙です。 –

0

あなたのコントローラでこれを試すことができます。

[self setEdgesForExtendedLayout:UIRectEdgeNone]; 

希望すると、これが役に立ちます。

関連する問題