问题
I have UIPageViewController
with one of its view controllers being a UITableViewController
. Each UITableViewCell
can collapse/expand to hide/show a nested table view. Whether or not any cells are expanded, I get this error sometimes when I scroll up and down in the 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)
I am very baffled as to why I'm getting this error. I'm wondering if the the UIScrollView
of my outer UITableView
is conflicting with the UIScrollView
of my UIPageViewController
, although I only get this error sometimes.
I looked up this error on the Internet and I have only found a few mentions of it, so any help or advice would be greatly appreciated. Thanks.
EDIT: Sorry for not including this earlier, but the UIPageViewController
has horizontal navigation.
回答1:
Here is my idea of how to deal with this problem.
- Disable user interaction with
UIPageViewController
completely usinguserinteractionenabled = NO
- Add Pan gesture recogniser to the UIView
- Then determine the direction of Pan and programmatically change UIPageViewController page
Add Pan Gesture
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
Handle Pan
- (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];
}
}
Here is how you can change UIPageViewController page programatically
Hope this helps. Cheers!!
回答2:
I ended up solving the bug my own way, luckily. Apparently, Apple told me that the UIScrollView
in the UIPageViewController
and the one in the UITableViewController
were conflicting, causing this bug.
All I did was put a UIPanGestureRecognizer
on the whole view, and whenever the user scrolls up or down, the UIScrollView
in the UIPageViewController
is disabled, allowing the user to scroll through the UITableView
without conflicts or crashing. When the user stop scrolling up or down, the UIScrollView
of the UIPageViewController
is re-enabled.
Frustrated that I didn't come up with this solution earlier, but oh well!
Whoever runs into the same problem and his still confused as the how I did my solution, please comment below and I will post my code fix.
来源:https://stackoverflow.com/questions/31977977/ios-uipageviewcontroller-failed-to-determine-navigation-direction