objective-c - 在 ios6 中,将 pageViewController 的 gestureRecognizers 委托(delegate)设置为 viewController 会导致崩溃

标签 objective-c ios xcode ios6

这在 ios6 中才开始发生,但如果你使用页面 View Controller 模板开始一个新项目。然后在

PCRootViewControlle::viewDidLoad()

将这些行添加到方法的底部。

for (UIGestureRecognizer *gR in self.pageViewController.gestureRecognizers)
{
    gR.delegate = self;
}

您需要分配 viewController 以使其符合 UIGestureRecognizerDelegate 并实现该方法

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch (UITouch *)touch
{
    return YES;
}

现在,如果您运行该应用程序并尝试将页面翻到边界之外,即转到一月并尝试返回

  • (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController

返回零。

然后该应用程序将崩溃。

这在 ios5 中没有发生。我需要将 gestureRecognizer 委托(delegate)分配给我的 viewController,因为我并不总是希望 pageViewController 处理触摸事件。

有没有其他人遇到过这种情况或指出我做错了什么?

非常感谢 斯图尔特。

最佳答案

终于找到了解决我的问题的方法,这个问题让我很伤心,所以希望这可以帮助其他人。

问题是如果您将 pageViewControllers 委托(delegate)设置为您的 viewController

for (UIGestureRecognizer *gR in self.pageController.view.gestureRecognizers) 
{
    if ([gR isKindOfClass:[UITapGestureRecognizer class]])
    {
        gR.enabled = NO;
    }
    else if ([gR isKindOfClass:[UIPanGestureRecognizer class]])
    {
        gR.delegate = self;
    }
}

然后从

返回 nil
pageViewController:viewControllerAfterViewController:

会崩溃!!仅限 iOS6!!

我的问题是我需要设置 gestureRecognisers 的委托(delegate),因为我需要在某些情况下拦截 panGesture,即不允许用户翻页,因为那里有一些按钮而触摸它的某些部分。

解决方案是把逻辑从

pageViewController:viewControllerAfterViewController: 

进入

gestureRecognizer:shouldReceiveTouch:

因为只要我们从那里返回 NO 那么它就不会继续调用

pageViewController:viewControllerAfterViewController:

因此无需返回 nil 并导致崩溃。

但是,这在序列的第一页和最后一页上不起作用。例如在第一页上,您希望允许页面向前翻但不能向后翻。所以我考虑查看传入的 GestureRecogniser,将其转换为 PanGesture,然后检查其速度,如果速度表示返回 (> 0.0f),则返回 NO。这听起来不错,但速度始终为零。

然后我在 GestureRecognizer 委托(delegate)上发现了一个非常有用的小函数,叫做:

gestureRecognizerShouldBegin:gestureRecognizer

这个函数在

之后被调用
gestureRecognizer:shouldReceiveTouch:

但这次手势的速度符合我的预期,所以我可以检查速度,如果第一页 > 0.0f,则只返回 YES

关于objective-c - 在 ios6 中,将 pageViewController 的 gestureRecognizers 委托(delegate)设置为 viewController 会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12561336/

相关文章:

objective-c - Obj-C MD5 哈希与 Java/SQL 不匹配

无法通过 self.prop 创建 Objective-C 结构属性指针?

objective-c - AssetForURL 返回 nil

ios - UICollectionView 动态标题大小

ios - Notes 应用程序的详细信息屏幕是如何设计的

iphone 开发 : caching images with asyncimageview library

swift - 即使在 Xcode 10.1 中自定义后, TableView 仍然显示基本

ios - 如何获取本地保存的UIImage到UIImage的路径?

ios - UITableViewCell 调整大小不流畅

ios - 当用户向上滚动时,如何使我的 tableHeaderView 捕捉和取消捕捉到隐藏/取消隐藏位置