我添加了向图片添加一个向上滑动的手势,但是当刷卡时,应用程序会出现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
。
提前致谢。
答案 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)的强引用来解决此问题,只要您将其实例化即可。