4

使用附加到视图的 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 文件是一个简单的视图。

在此处输入图像描述

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

4

2 回答 2

8

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

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

编辑(响应问题的编辑)正如omz正确指出的那样,您在'退出TaskViewController时被释放。有两种处理方法:BoardViewControllerviewDidLoad:

  • 将该方法折叠handlePan到父视图控制器中,连同viewDidLoad:, 或
  • 为 制作一个实例变量TaskViewController *taskA,而不是使其成为局部变量。
于 2012-08-12T13:33:32.560 回答
0

这是我使用手势识别器的方式。我认为这种方式很简单,风险也很低。

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

ss

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

ss

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

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

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

https://github.com/weed/p120812_PanGesture

于 2012-08-12T13:39:21.317 回答