我有一个导航控制器,它的根视图控制器的类型是CollectionViewControllerA
. 选择一个项目后,我有一个淡出和扩展动画,然后调用将第二个类型的视图控制器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];
}];
我以类似的方式弹出视图控制器
[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:
首先调用呢?没有任何改变in 代码contentOffset
,collectionView
也没有用户交互。除非更改transform
属性也会触发方法被调用?
CollectionViewControllerB
实现scrollViewDidScroll:
,因为我需要禁用垂直滚动。
同时我有一个非常非常混乱的黑客来防止崩溃,那就是在动画之前,我添加
self.collectionView.delegate = nil;
这会阻止该方法被调用。但必须有更好的方法。
任何人都可以阐明为什么scrollViewDidScroll:
被调用以及如何停止它?