UIGestureRecognizer崩溃

时间:2013-05-13 15:03:22

标签: ios crash uigesturerecognizer uiswipegesturerecognizer

我添加了向图片添加一个向上滑动的手势,但是当刷卡时,应用程序会出现BAD_EXEC错误。

这就是我所拥有的:

.h文件:

@interface MyViewController : UIViewController <UIGestureRecognizerDelegate>
{

    UISwipeGestureRecognizer* swipeUpGesture;
    IBOutlet UIImageView*   myImage;  //Connected from Interface Builder
    IBOutlet UIScrollView*  myScrollView;
}

@property (retain, nonatomic) UISwipeGestureRecognizer* swipeUpGesture;
@property (retain, nonatomic) IBOutlet UIImageView* myImage;
@property (retain, nonatomic) IBOutlet UIScrollView*  myScrollView;

.m文件:

- (void)viewDidLoad
{

   //myImage is inside of myScrollView

   swipeUpGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiped)];
   [swipeUpGesture setDirection:UISwipeGestureRecognizerDirectionUp];
   [swipeUpGesture setDelegate:self];
   [myImage addGestureRecognizer: swipeUpGesture];

}


- (void)swiped:(UISwipeGestureRecognizer*)sentGesture
{
    NSLog (@"swiped");
}

基本上,在myView内,我有myScrollView。在myScrollView内,我有myImage

当我在代码上方运行时,应用会一直运行,直到我向上滑动,然后它实际上会识别滑动,但没有到达NSLog,崩溃并且我得到BAD_EXEC

提前致谢。

4 个答案:

答案 0 :(得分:3)

如果您使用addSubview,请执行以下操作:

[self addChildViewController:myViewController];

之后:

[self.view addSubView: myViewController.view];

然后在视图控制器中使用UISwipeGestureRecognizer。

答案 1 :(得分:2)

您的签名不匹配。

swipeUpGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiped)];

您的选择器被“刷过”,没有冒号,这意味着目标c运行时将尝试找到一个采用“零”参数的方法。

由于你的“swiped”接受了一个参数,因此当运行时尝试调用该方法并因此崩溃时,运行时将无法找到匹配项。

-

将@selector(刷过)更改为@selector(刷过:),它应该可以正常工作。

答案 2 :(得分:1)

你忘了冒号:

swipeUpGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiped)];

应该是

swipeUpGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiped:)];

没有冒号,Obj-C运行时将尝试查找没有任何参数的方法。

答案 3 :(得分:0)

(正如@Undo所说,你忘了冒号。)

但是,如果ViewController在触摸事件发生之前被释放,您仍然会收到EXC_BAD_ACCESS错误。

将ViewController视图作为子视图添加到另一个视图控制器时会发生这种情况。 e.g。

 [mainViewController.view addSubview:self.view]

self是你的MyViewController。您可以通过在

中添加断点来检查这一点
-(void)dealloc

MyViewController的方法。并在触摸事件之前检查MyViewController是否已被释放。

您可以通过添加对MyViewController(ARC)的强引用来解决此问题,只要您将其实例化即可。