2010-12-02 23 views
0

我的经验我的iPhone应用程序的偶然碰撞那里我得到以下异常枚举突变在UIView的transitionWithView

NSGenericException', reason: '*** Collection <CALayerArray: 0x26f6b0> was mutated while being enumerated. 

随着堆栈跟踪的崩溃线程上

Thread 0 Crashed: 
0 libSystem.B.dylib     0x00078ac8 __kill + 8 
1 libSystem.B.dylib     0x00078ab8 kill + 4 
2 libSystem.B.dylib     0x00078aaa raise + 10 
3 libSystem.B.dylib     0x0008d03a abort + 50 
4 libstdc++.6.dylib     0x00044a20 __gnu_cxx::__verbose_terminate_handler() + 376 
5 libobjc.A.dylib      0x00005958 _objc_terminate + 104 
6 libstdc++.6.dylib     0x00042df2 __cxxabiv1::__terminate(void (*)()) + 46 
7 libstdc++.6.dylib     0x00042e46 std::terminate() + 10 
8 libstdc++.6.dylib     0x00042f16 __cxa_throw + 78 
9 libobjc.A.dylib      0x00004838 objc_exception_throw + 64 
10 CoreFoundation      0x0009f850 __NSFastEnumerationMutationHandler + 208 
11 libobjc.A.dylib      0x0000a51a objc_enumerationMutation + 18 
12 UIKit        0x00007bfe -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] + 142 
13 UIKit        0x00007c2e -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] + 190 
14 UIKit        0x00007cd2 -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:] + 22 
15 UIKit        0x00007628 -[UIView(Internal) _addSubview:positioned:relativeTo:] + 304 
16 UIKit        0x000074e8 -[UIView(Hierarchy) addSubview:] + 16 
17 UIKit        0x0006c350 +[UIViewControllerWrapperView wrapperViewForView:frame:] + 232 
18 UIKit        0x00077d0c -[UINavigationController _startTransition:fromViewController:toViewController:] + 468 
19 UIKit        0x00077abc -[UINavigationController _startDeferredTransitionIfNeeded] + 176 
20 UIKit        0x00077a00 -[UINavigationController viewWillLayoutSubviews] + 8 
21 UIKit        0x0006dca8 -[UILayoutContainerView layoutSubviews] + 132 
22 UIKit        0x0000fbc0 -[UIView(CALayerDelegate) _layoutSublayersOfLayer:] + 20 
23 CoreFoundation      0x0003e2e4 -[NSObject(NSObject) performSelector:withObject:] + 16 
24 QuartzCore       0x0000f942 -[CALayer layoutSublayers] + 114 
25 QuartzCore       0x0000f6fa CALayerLayoutIfNeeded + 178 
26 QuartzCore       0x000094c4 CA::Context::commit_transaction(CA::Transaction*) + 204 
27 QuartzCore       0x000092da CA::Transaction::commit() + 186 
28 QuartzCore       0x0002d9b6 CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 46 
29 CoreFoundation      0x00030236 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 10 
30 CoreFoundation      0x000300aa __CFRunLoopDoObservers + 406 
31 CoreFoundation      0x000276b4 __CFRunLoopRun + 848 
32 CoreFoundation      0x00027270 CFRunLoopRunSpecific + 224 
33 CoreFoundation      0x00027178 CFRunLoopRunInMode + 52 
34 GraphicsServices     0x000045ec GSEventRunModal + 108 
35 GraphicsServices     0x00004698 GSEventRun + 56 
36 UIKit        0x0000411c -[UIApplication _run] + 396 
37 UIKit        0x00002128 UIApplicationMain + 664 
38 iDriveGreen       0x00003026 main (main.m:13) 
39 iDriveGreen       0x00002ff0 start + 32 

下面的代码执行后会触发此崩溃。

StopRouteViewController *stopVC = [[StopRouteViewController alloc] init]; 
[UIView transitionWithView:self.navigationController.view 
        duration:0.5 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
       animations:^{ 
        [self.navigationController pushViewController:stopVC animated:NO]; 
       } 
       completion:NULL]; 
[stopVC release]; 

这是否看起来公然错对任何人?我目前的想法是,要么是绑定到stopVC被推出之前,或与navigationController.view转换同时推动一个新的viewController导航控制器。

由于这只是偶尔发生,所以我希望在提交潜在修复程序之前多一点信心。

+0

你想在这里做什么?您是否试图提供自己的自定义动画(左右翻转)而不是UINavigationController的默认Push和Pop动画? – 2010-12-03 09:26:43

+0

这是正确的Raj – matheeeny 2010-12-03 14:08:54

回答

1

是的,这是API的不正确用法。 - [UINavigationController pushViewController:animated:]自己处理动画。即使你传递NO作为第二个参数,它仍然在操纵视图层次结构,这是导致你崩溃的原因。

基本上,没有理由在动画块中调用 - [UINavigationController pushViewController:animated:],就像你所做的那样。如果你想动画推动你的控制器,传递YES作为第二个参数。