错误消息:[__ NSCFType _canScrollX]:无法识别的选择器

时间:2013-11-19 21:15:20

标签: xcode ios5

当我从UIWebView滑动到UIScrollView时,我通常会更新该应用,但并非总是会崩溃。有时它会给出标题中显示的错误。大多数情况下没有错误消息。奇怪的是,如果我使用按钮移动到下一个屏幕,它不会崩溃。按钮和滑动手势识别器调用相同的处理程序。

我在运行iOS 5.1.1的第一代iPad上遇到了崩溃据我所知,它在6月份我提交的任何版本的iOS 5上运行良好。我从应用程序商店下载了该应用程序的副本,它也在运行iOS 5.1.1的iPad上崩溃。

我的解决方法是禁用在低于6.0的版本上滑动。

if ( SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0") ) {
            UISwipeGestureRecognizer *swipeNext;
            swipeNext = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeNext)];
            [swipeNext setDirection:(UISwipeGestureRecognizerDirectionLeft)];
            [self.view addGestureRecognizer:swipeNext]; 
}

我在iOS6和iOS7中测试时工作正常。我没有设置_canScrollX。事实上,我甚至无法在文档中找到该方法[编辑:它可能是属性,而不是方法]。我只在scrollview上设置了两个属性。

CGFloat quizHeight = ceilf(.9f * _parentView.bounds.size.height - verticalOffset);
        CGRect quizBounds = CGRectMake(0, verticalOffset, _parentView.bounds.size.width, quizHeight );
        _quizView = [[UIScrollView alloc] initWithFrame:quizBounds];
        _quizView.delaysContentTouches = YES;
        _quizView.maximumZoomScale = 1.0f; // Helps with swiping

我不认为这是一个内存问题,因为它通常会在第一个屏幕上崩溃。我检查了我的代码中iOS5不支持的方法,但没有。但即使有,我认为应用程序会一直崩溃,而不是一些时间,它会给我一个关于导致问题的选择器的错误消息。

所以我很难过。有什么想法吗?

[编辑{我尝试在启用僵尸的情况下运行,并且没有任何问题。当我使用屏幕按钮从屏幕移动到屏幕时,实时字节会波动但返回到大约2.4MB。如果我滑动,我会在仪器中发生故障并没有说明原因。

从屏幕到屏幕的成功移动和崩溃之间的唯一区别是滑动手势。屏幕上的按钮和滑动手势识别器都调用相同的方法。

这是崩溃日志。

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x336f0f78 objc_msgSend + 16
1   UIKit                           0x332f50e2 -[UIScrollViewPanGestureRecognizer _centroidMovedTo:atTime:] + 298
2   UIKit                           0x332f4f50 -[UIPanGestureRecognizer touchesMoved:withEvent:] + 308
3   UIKit                           0x332f4d52 -[UIScrollViewPanGestureRecognizer touchesMoved:withEvent:] + 70
4   UIKit                           0x331ec484 -[UIWindow _sendGesturesForEvent:] + 356
5   UIKit                           0x331ec1ee -[UIWindow sendEvent:] + 82
6   UIKit                           0x331d268e -[UIApplication sendEvent:] + 350
7   UIKit                           0x331d1f34 _UIApplicationHandleEvent + 5820
8   GraphicsServices                0x337c4224 PurpleEventCallback + 876
9   CoreFoundation                  0x35aa651c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32
10  CoreFoundation                  0x35aa64be __CFRunLoopDoSource1 + 134
11  CoreFoundation                  0x35aa530c __CFRunLoopRun + 1364
12  CoreFoundation                  0x35a2849e CFRunLoopRunSpecific + 294
13  CoreFoundation                  0x35a28366 CFRunLoopRunInMode + 98
14  GraphicsServices                0x337c3432 GSEventRunModal + 130
15  UIKit                           0x33200cce UIApplicationMain + 1074
16  Comprehension                   0x000623d4 main (main.m:14)
17  Comprehension                   0x00062388 start + 32

1 个答案:

答案 0 :(得分:0)

这似乎是iOS5和旧iPad上的计时问题。

我将iOS5的滑动手势识别器更改为

swipeNext = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeNextAfterDelay)];

并添加了此处理程序,可以延迟刷卡后运行的代码。

- (void)handleSwipeNextAfterDelay {
        [self performSelector:@selector(handleSwipeNext) withObject:nil afterDelay:0.2];
}