UIPageViewController NSInternalInconsistencyException

我正在开发一个有两页的简单UIPageViewController 。 每个页面都是从不同的ViewController加载的,其中包含名为PViewControllerTViewController的特定xib文件。

对于PViewController ,有三种不同的视图,我们称之为ABC. 当应用程序启动时, PViewController显示成功,我可以向左滑动以查看TViewController ,也没有问题。 但是,当我在PViewController并作为对事件的响应时,我将当前视图A更改为另一个视图B ,然后向左滑动以转到TViewController ,我收到以下exception,应用程序终止:

 *** Assertion failure in -[_UIQueuingScrollView _setWrappedViewAtIndex:withView:], /SourceCache/UIKit_Sim/UIKit-2935.137/_UIQueuingScrollView.m:338 2014-07-10 13:57:23.389 ***** [2012:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unexpected subviews' *** First throw call stack: ( 0 CoreFoundation 0x01fde1e4 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x01c418e5 objc_exception_throw + 44 2 CoreFoundation 0x01fde048 +[NSException raise:format:arguments:] + 136 3 Foundation 0x018214de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116 4 UIKit 0x00f3cc14 -[_UIQueuingScrollView _setWrappedViewAtIndex:withView:] + 261 5 UIKit 0x00f3d248 -[_UIQueuingScrollView _replaceViews:updatingContents:adjustContentInsets:animated:] + 812 6 UIKit 0x00f3d690 -[_UIQueuingScrollView _viewAtIndex:loadingIfNecessary:updatingContents:animated:] + 421 7 UIKit 0x00f40c65 __54-[_UIQueuingScrollView _didScrollWithAnimation:force:]_block_invoke + 110 8 UIKit 0x00f408de -[_UIQueuingScrollView _didScrollWithAnimation:force:] + 579 9 UIKit 0x00f3c452 -[_UIQueuingScrollView layoutSubviews] + 186 10 UIKit 0x00970964 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355 11 libobjc.A.dylib 0x01c5382b -[NSObject performSelector:withObject:] + 70 12 QuartzCore 0x04be445a -[CALayer layoutSublayers] + 148 13 QuartzCore 0x04bd8244 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380 14 QuartzCore 0x04bd80b0 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26 15 QuartzCore 0x04b3e7fa _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294 16 QuartzCore 0x04b3fb85 _ZN2CA11Transaction6commitEv + 393 17 QuartzCore 0x04b40258 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92 18 CoreFoundation 0x01fa636e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30 19 CoreFoundation 0x01fa62bf __CFRunLoopDoObservers + 399 20 CoreFoundation 0x01f839eb CFRunLoopRunSpecific + 491 21 CoreFoundation 0x01f837eb CFRunLoopRunInMode + 123 22 GraphicsServices 0x030285ee GSEventRunModal + 192 23 GraphicsServices 0x0302842b GSEventRun + 104 24 UIKit 0x00901f9b UIApplicationMain + 1225 25 ******* 0x000239fd main + 141 26 libdyld.dylib 0x02cc1701 start + 1 27 ??? 0x00000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException 

这是我为UIPageViewController实现的协议方法:

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { UIViewController *vc; if(self.index==1) { vc = (PViewController *)[[PViewController alloc] initWithNibName:@"PViewController" bundle:nil]; } self.index--; return vc; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { UIViewController *vc; if(self.index==0) vc = (TViewController *)[[TViewController alloc] initWithNibName:@"TViewController" bundle:nil]; self.index++; return vc; } //The exception occurs exactly when the app reaches this point. 

这就是我在视图控制器中切换视图的方式,简单地说:

 self.view = self.B; 

问题:

我无法追查问题。 我不知道在哪里捕获此exception或导致它的原因是什么?

在使用启动时传递的以下参数时,我偶然遇到了同样的错误:

 -UIViewShowAlignmentRects YES 

在我的UIPageViewController中浪费2天试图找到错误之后,结果发现在禁用XCode生成的黄色矩形包装器之后,NSInternalConsistencyException被蒸发了。

想出来(至少我的问题是什么) – 你不应该直接设置UIViewController的self.view,而是使用self.view.addSubview(viewA)然后使用

 UIView.transitionFromView(self.viewA, toView: self.viewB, duration: 0.5, options: UIViewAnimationOptions.TransitionFlipFromLeft, completion: nil) 

在我的情况下,这发生在我尝试导航到另一个视图控制器中的下一页视图控制器时,该控制器呈现为模态

希望这有助于其他人。