27

나는 네비게이션 컨트롤러를 가지고 있는데, 루트 뷰 컨트롤러의 타입은 CollectionViewControllerA입니다. 항목을 선택하면, I는 페이드를 갖고 통화 다음 애니메이션을 확장하면 스택에 입력 CollectionVewControllerB의 제보기 컨트롤러 밀어 :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]; 
       }]; 
의보기 제어기 팝

여기에서 문제는보기 컨트롤러를 터뜨릴 때 앱이 충돌한다는 것입니다. 이유 :

*** -[CollectionViewControllerB scrollViewDidScroll:]: message sent to deallocated instance 

나는 튀어 뷰 컨트롤러가 파괴되기 때문에 문제가 있음을 이해하지만 왜 scrollViewDidScroll:가 처음에 호출되는 하는가? 코드에서 collectionViewcontentOffset을 변경하지 않으며 사용자 상호 작용도 없습니다. transform 속성을 변경하지 않으면 메서드가 호출되기 시작합니다.

CollectionViewControllerB 구현 나는 수직 스크롤을 중지해야 scrollViewDidScroll: 때문이다.

한편 나는 충돌을 방지하기 위해 아주 아주 지저분한 해킹을 가지고, 그것은 애니메이션 전에, 내가

self.collectionView.delegate = nil; 

이 호출하기의 방법을 중지 추가합니다. 그러나 더 좋은 방법이 있어야합니다.

누군가 scrollViewDidScroll:이 호출 된 이유와 중지 방법에 대해 알아 보았습니까?

+0

저는 같은 문제에 봉착 했습니다만, segues를 사용했습니다. 내 솔루션은 당신과 동일했습니다. viewWillDisappear에 델리게이트가 없습니다. 왜 이런 일이 일어날 지 모르겠다. 어떻게 든 튀어 나오는 것은 contentOffset을 변경하는 경우 일 것임에 틀림 없지만, 어떻게 또는 왜 나는 모르겠습니다. –

+0

나는 델리게이트를 nil-ing하는 것이 어떤 솔루션이라도 좋다고 생각합니다 ... 어쨌든 객체가 파괴 될 것임을 알았습니다. –

답변

56

문제를 해결하는 유일한 방법은 이미 수행 한 작업입니다. 애니메이션 전에 델리게이트를 무효로 설정하는 것입니다.

self.collectionView.delegate = nil; 

나중에 다른 사람에게 도움이되기를 바랍니다.

+9

- (void) dealloc 메소드에 추가했습니다. – mishimay

+0

@md_develop는 그것을 놓을 수있는 가장 좋은 곳입니다. –

+3

방금 ​​UITableView로 이런 일이 생겼습니다. 이유는 모르겠지만 대리자를 설정하지 않으면 고정됩니다. 그러나, 어떤 이유로, 그것은 해킹처럼 느껴집니다. – Johnny

9

보기 컨트롤러 내에 self.automaticallyAdjustsScrollViewInsets = NO;을 설정하십시오.

나는 이와 비슷한 문제가있어서 페이지에서 벗어날 때마다 contentOffset이 매회 20 회씩 변경된다는 것을 알게되었습니다.

내보기 컨트롤러 내에서이 속성을 설정하면이 변경이 중지되고 따라서 scrollViewDidScroll이 더 이상 호출되지 않습니다. 보기 컨트롤러가 상태 표시 줄, 탐색 막대 등의 변경 사항에 대한 콘텐츠 삽입물을 자동으로 조정합니다. 멀리 이동할 때도 마찬가지입니다.

저는 이것이 스크롤 방법이 호출되는 이유에 대한 더 나은 해결책과 적절한 설명이라고 생각합니다.

+0

나를 위해 'self.automaticallyAdjustsScrollViewInsets = NO;'가 충돌을 일으켰다. 'YES'로 다시 설정하여 문제를 해결했습니다. 이것은 매우 이상합니다. –

0

컨트롤러에서 사용해 볼 수 있습니다.

[self setEdgesForExtendedLayout:UIRectEdgeNone]; 

희망이 도움이 될 것입니다.

관련 문제