UIGestureRecognizer引起"EXC_BAD_ACCESS"错误

4
使用附加到视图的手势识别器会导致我的应用程序崩溃,并显示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个回答

8

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

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

编辑(针对问题的编辑)正如omz所正确指出的那样,当BoardViewControllerviewDidLoad:退出时,您的TaskViewController会被释放。有两种处理方法:

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

谢谢提醒,我已经更正了。不过现在我遇到了"EXC_BAD_ACCESS"错误。你有任何想法吗? - Bernd
ARC在viewDidLoad方法结束时释放了您的taskA视图控制器(因为您没有其他对它的引用),因此目标变得无效。 - omz
哦,是的,对了。最好的方法是什么?创建一个NSMutableArray来存储所有被实例化的任务对象的引用? - Bernd
我添加了一个数组来保存对任务视图的引用(在这种情况下是taskA)。我相应地更新了代码。但我仍然收到“EXC_BAD_ACCESS”错误。 - Bernd

0
这是我使用手势识别器的方式。我认为这种方式简单易行且风险较低。
首先,您需要将手势识别器拖放到视图中。

ss

然后,您将手势识别器图标连接到代码。

ss

最后,您可以像下面这样编写此IBAction的代码:

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

你可以从GitHub下载这个项目,然后直接运行它。

https://github.com/weed/p120812_PanGesture


谢谢您的回复。不过正如我之前提到的,我更喜欢在代码中实现它。此外,我不使用故事板。 :) - Bernd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接