我正在开发一个有两页的简单UIPageViewController
。每个页面都是使用其ViewController
个文件加载的xib
个文件,名为PViewController
和TViewController
。
对于PViewController
,有三种不同的视图,我们称之为 A , B 和 C 。应用程序启动后,PViewController
成功显示,我可以向左滑动以查看TViewController
,也没有问题。但是,当我在PViewController
并且作为对事件的响应时,我将当前视图 A 更改为另一个视图 B ,然后向左滑动以转到TViewController
,我收到以下异常,应用程序终止:
*** 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;
问题:
我无法追查问题。我不知道在哪里捕获此异常或导致它的原因是什么?
答案 0 :(得分:4)
在使用启动时传递的以下参数时,我偶然遇到了同样的错误:
-UIViewShowAlignmentRects YES
在我的UIPageViewController中浪费了2天试图找到错误后,结果发现在禁用XCode生成的黄色矩形包装后,NSInternalConsistencyException被蒸发了。
答案 1 :(得分:3)
想出来(至少我的问题是什么) - 你不应该直接设置UIViewController的self.view,而是使用self.view.addSubview(viewA)然后使用
UIView.transitionFromView(self.viewA, toView: self.viewB, duration: 0.5, options: UIViewAnimationOptions.TransitionFlipFromLeft, completion: nil)
答案 2 :(得分:3)
就我而言,当我尝试导航到另一个以模态呈现的视图控制器中的下一页视图控制器时,就会发生这种情况。
希望这有助于其他人。
答案 3 :(得分:0)
我在情节提要中有一个“ UIPageViewController”,并且在其中一个页面中,我试图提供一个新的“ UINavigationController”以及附加的“ Rootviewcontroller”,后者位于单独的xib中。
当我移除xib并将此视图控制器作为单独放置在情节提要中时,它就像一种魅力。
因此,我认为要抓住的是,如果两个容器视图都在同一个情节提要中,则不会给出任何异常或错误。
let listView = String(describing: ListViewController.self)
let listViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: listView)
let navigationController = UINavigationController(rootViewController: listViewController)
self.present(navigationController, animated: true, completion: nil)
答案 4 :(得分:0)
我通过将方向.forward更改为.reverse来修复此崩溃
pageViewController?.setViewControllers([viewController], direction: direction, animated: true)