iOS – UIPageViewController’无法确定导航方向’

我有一个UIPageViewController ,其中一个视图控制器是一个UITableViewController 。 每个UITableViewCell都可以折叠/展开以隐藏/显示嵌套的表视图。 无论是否扩展了任何单元格,当我在UITableView向上和向下滚动时,有时会出现此错误:

 2015-08-12 20:11:15.184 MyApp[4506:172368] *** Assertion failure in -[_UIQueuingScrollView _didEndDraggingManualScroll], /SourceCache/UIKit_Sim/UIKit-3347.44.2/_UIQueuingScrollView.m:861 2015-08-12 20:11:15.261 MyApp[4506:172368] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Failed to determine navigation direction' *** First throw call stack: ( 0 CoreFoundation 0x000000010d52bc65 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010c94cbb7 objc_exception_throw + 45 2 CoreFoundation 0x000000010d52baca +[NSException raise:format:arguments:] + 106 3 Foundation 0x000000010b00b98f -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195 4 UIKit 0x000000010ba257a2 -[_UIQueuingScrollView _didEndDraggingManualScroll] + 151 5 UIKit 0x000000010ba2147d -[_UIQueuingScrollView _scrollViewDidEndDraggingWithDeceleration:] + 40 6 UIKit 0x000000010b49f8d0 -[UIScrollView _endPanNormal:] + 1415 7 UIKit 0x000000010b4a0ddc -[UIScrollView handlePan:] + 98 8 UIKit 0x000000010b7be656 _UIGestureRecognizerSendActions + 262 9 UIKit 0x000000010b7bd2f9 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 532 10 UIKit 0x000000010b7c1f16 ___UIGestureRecognizerUpdate_block_invoke662 + 51 11 UIKit 0x000000010b7c1e12 _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 254 12 UIKit 0x000000010b7b7e8d _UIGestureRecognizerUpdate + 2796 13 UIKit 0x000000010b45b646 -[UIWindow _sendGesturesForEvent:] + 1041 14 UIKit 0x000000010b45c272 -[UIWindow sendEvent:] + 666 15 UIKit 0x000000010b422541 -[UIApplication sendEvent:] + 246 16 UIKit 0x000000010b42fcdc _UIApplicationHandleEventFromQueueEvent + 18265 17 UIKit 0x000000010b40a59c _UIApplicationHandleEventQueue + 2066 18 CoreFoundation 0x000000010d45f431 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 19 CoreFoundation 0x000000010d4552fd __CFRunLoopDoSources0 + 269 20 CoreFoundation 0x000000010d454934 __CFRunLoopRun + 868 21 CoreFoundation 0x000000010d454366 CFRunLoopRunSpecific + 470 22 GraphicsServices 0x0000000110821a3e GSEventRunModal + 161 23 UIKit 0x000000010b40d8c0 UIApplicationMain + 1282 24 MyApp 0x000000010aad6eef main + 111 25 libdyld.dylib 0x000000010e2bc145 start + 1 26 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb) 

我很困惑,为什么我收到这个错误。 我想知道我的外部UITableViewUIScrollView与我的UIPageViewControllerUIScrollView冲突,虽然我有时只会收到此错误。

我在互联网上查了这个错误,我只找到了一些提及它,所以任何帮助或建议将不胜感激。 谢谢。

编辑:很抱歉不包括这个,但UIPageViewController有水平导航。

这是我对如何处理这个问题的想法。

  1. 使用userinteractionenabled = NO完全禁用用户与UIPageViewController交互
  2. 向UIView添加平移手势识别器
  3. 然后确定Pan的方向并以编程方式更改UIPageViewController页面

添加Pan Gesture

  UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; 

处理锅

  - (void)panRecognized:(UIPanGestureRecognizer *)rec { CGPoint vel = [rec velocityInView:self.view]; if (vel.x > 0) { // user dragged towards the right [self goToNextPage]; } else { // user dragged towards the left [self goToPrevPage]; } } 

以下是如何以编程方式更改UIPageViewController页面的方法

希望这可以帮助。 干杯!!

幸运的是,我最终以自己的方式解决了这个问题。 显然,Apple告诉我UIPageViewController中的UIScrollViewUITableViewController中的UIScrollView是冲突的,导致这个bug。

我所做的就是在整个视图中放置一个UIPanGestureRecognizer ,每当用户向上或向下滚动时, UIPageViewControllerUIScrollView被禁用,允许用户滚动UITableView而不会发生冲突或崩溃。 当用户停止向上或向下滚动时,将重新启用UIPageViewControllerUIScrollView

沮丧的是我之前没有提出这个解决方案,但是哦!

无论谁遇到同样的问题,他仍然困惑我的解决方案,请在下面评论,我将发布我的代码修复。