在方法viewControllerAfterViewController和viewControllerBeforeViewController中的iOS6中,如果返回nil (在第一页或最后一页时阻止页面导航),则应用程序崩溃,但有此例外:
“提供的视图控制器数量(0)与所请求的转换所需的数量(1)不匹配”
在iOS5中,一切都很好。
发布于 2012-09-24 22:10:06
我也有过同样的问题。我发现原因是取代了UIPanGestureRecognizer of UIPageViewController的代表,这是不-不是的。pan手势识别器调用了_gestureRecognizerShouldBegin:(注意前面的下划线)方法,UIPageViewController实现了该方法,并且显然依赖于正确工作(读:不崩溃)。最后,我实现了respondsToSelector:和forwardingTargetForSelector:在我的类中,它使用UIPageViewController将无文档的委托方法传递给UIPageViewController,而没有具体地命名它(几乎可以肯定,这给我带来了应用程序商店的审查拒绝)。
-(BOOL)respondsToSelector:(SEL)aSelector {
if ([super respondsToSelector:aSelector])
return YES;
else if ([self.pageViewController respondsToSelector:aSelector])
return YES;
else
return NO;
}
- (id)forwardingTargetForSelector:(SEL)aSelector {
if ([super respondsToSelector:aSelector]) {
return nil;
} else if ([self.pageViewController respondsToSelector:aSelector]) {
return self.pageViewController;
}
return nil;
}我的长期解决方案将是重新使用UIPageViewController,这样我就不需要替换手势识别器委托。
发布于 2012-10-08 06:47:56
啊,我想知道为什么没有人指出这个问题,我花了将近两个晚上才找到解决办法。
旧代码( iOS 5.1):当在第一页和最后一页返回零时,您将体验到应用程序crash.It在iOS 5.1中工作得很好,但在iOS 6中却不会。
- (UIViewController *)pageViewController:
(UIPageViewController *)pageViewController viewControllerBeforeViewController:
(UIViewController *)viewController
{
for (UIGestureRecognizer *recognizer in pageController.gestureRecognizers) {
if ([recognizer isKindOfClass:[UITapGestureRecognizer class]]) {
recognizer.enabled = NO;
}
}
NSUInteger index = [self indexOfViewController:
(MainViewController *)viewController];
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
return [self viewControllerAtIndex:index];
}
- (UIViewController *)pageViewController:
(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
for (UIGestureRecognizer *recognizer in pageController.gestureRecognizers) {
if ([recognizer isKindOfClass:[UITapGestureRecognizer class]]) {
recognizer.enabled = NO;
}
}
NSUInteger index = [self indexOfViewController:
(MainViewController *)viewController];
if (index == NSNotFound) {
return nil;
}
}解决方案( -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer 6):在将手势效果添加到superview之后,只需调用名为iOS*的委托gestureRecognizer即可。我所做的是安静而简单的,计算用户翻转第一页和最后一页的速度(我指的是使用手势识别器),我否认您需要做的swiping.All只是粘贴以下代码,您就完成了!
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if (pageNum==0) {
if ([(UIPanGestureRecognizer*)gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] &&
[(UIPanGestureRecognizer*)gestureRecognizer velocityInView:gestureRecognizer.view].x > 0.0f) {
//NSLog(@"Swiping to left on 1st page is denied");
return NO;
}
if ([(UITapGestureRecognizer*)gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] &&
[(UITapGestureRecognizer*)gestureRecognizer locationInView:gestureRecognizer.view].x < self.view.frame.size.width/2) {
//NSLog(@"tapping to left on 1st page is denied");
return NO;
}
}
else if(pageNum ==totalNoOfFiles-1)
{
if ([(UIPanGestureRecognizer*)gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] &&
[(UIPanGestureRecognizer*)gestureRecognizer velocityInView:gestureRecognizer.view].x < 0.0f) {
//NSLog(@"Swiping to right on 1st page is denied");
return NO;
}
if ([(UITapGestureRecognizer*)gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] &&
[(UITapGestureRecognizer*)gestureRecognizer locationInView:gestureRecognizer.view].x > self.view.frame.size.width/2) {
//NSLog(@"Tapping to right on 1st page is denied");
return NO;
}
}
return YES;
}
- (UIViewController *)pageViewController:(UIPageViewController*) pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
int index = [self indexOfViewController:(ChildViewController *)viewController];
index--;
return [self viewControllerAtIndex:index];
}
- (UIViewController *)pageViewController:
(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
int index = [self indexOfViewController:(ChildViewController *)viewController];
index++;
return [self viewControllerAtIndex:index];
}发布于 2012-10-17 16:39:44
这一点已经讨论过了,但我有一件事要补充。请考虑为什么要将手势识别器的委托设置为self。在我的例子中,这是因为在某些情况下,我想防止手势识别器与委托的gestureRecognizerShouldBegin:识别。
但是在出现这个问题的iOS 6中,通过在gestureRecognizerShouldBegin:上实现UIView,有一种全新的方法可以做到这一点。(这是UIView 6中的一个新的iOS实例方法。)
因此,我能够完全完成我以前所做的事情,而不改变手势识别器的代表。
https://stackoverflow.com/questions/12565400
复制相似问题