UIGestureRecognizer导致“EXC_BAD_ACCESS”错误

时间:2012-08-12 13:31:15

标签: objective-c ios uigesturerecognizer

使用附加到视图的GestureRecognizer会导致我的应用因 EXC_BAD_ACCESS 错误而崩溃。这是涉及的课程

BoardViewController - 在AppDelegate中显示设置为rootViewController的板(作为背景)。它实例化了“TaskViewcontroller”的多个对象。

//BoardViewController.h
@interface BoardViewController : UIViewController {
    NSMutableArray* allTaskViews; //for storing taskViews to avoid having them autoreleased
}

//BoardViewController.m - Rootviewcontroller, instantiating TaskViews    
- (void)viewDidLoad
{
    [super viewDidLoad];
    TaskViewController* taskA = [[TaskViewController alloc]init];
    [allTaskViews addObject:taskA];
    [[self view]addSubview:[taskA view]];
}

TaskViewController - 电路板上显示的个人框。它应该是可拖动的。因此,我将UIPanGestureRecoginzer附加到其视图

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIPanGestureRecognizer* panRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)];
    [[self view] addGestureRecognizer:panRecognizer];
}

- (void)handlePan:(UIPanGestureRecognizer *)recognizer {
    NSLog(@"PAN!");
}

.xib文件是一个简单的视图。

enter image description here

使用手势识别器进行的所有编程我更喜欢在代码中进行。知道如何修复导致应用程序崩溃的错误吗?

2 个答案:

答案 0 :(得分:8)

方法handlePan位于视图控制器上,而不是视图上。您应该将目标设置为self

UIPanGestureRecognizer* panRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)];

编辑(响应问题的编辑)正确地注意到omzTaskViewControllerBoardViewController {{1}时被释放}} 出口。有两种方法可以处理它:

  • viewDidLoad:方法与handlePan的代码或
  • 折叠到父视图控制器中
  • viewDidLoad:创建一个实例变量,而不是将其作为局部变量。

答案 1 :(得分:0)

这是我使用Gesture Recognizer的方法。我认为这种方式很容易且风险很低。

首先,将Gesture Recognizer拖放到视图中。

ss

然后,您将Gesture Recognizer图标连接到代码。

ss

最后,您为此IBAction编写代码,如下所示:

- (IBAction)handlePan:(id)sender {
    NSLog(@"PAN!");
}

您可以从GitHub下载此项目并运行它。

https://github.com/weed/p120812_PanGesture