使用附加到视图的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文件是一个简单的视图。
使用手势识别器进行的所有编程我更喜欢在代码中进行。知道如何修复导致应用程序崩溃的错误吗?
答案 0 :(得分:8)
方法handlePan
位于视图控制器上,而不是视图上。您应该将目标设置为self
:
UIPanGestureRecognizer* panRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)];
编辑(响应问题的编辑)正确地注意到omz,TaskViewController
在BoardViewController
{{1}时被释放}} 出口。有两种方法可以处理它:
viewDidLoad:
方法与handlePan
的代码或viewDidLoad:
创建一个实例变量,而不是将其作为局部变量。答案 1 :(得分:0)
这是我使用Gesture Recognizer的方法。我认为这种方式很容易且风险很低。
首先,将Gesture Recognizer拖放到视图中。
然后,您将Gesture Recognizer图标连接到代码。
最后,您为此IBAction编写代码,如下所示:
- (IBAction)handlePan:(id)sender {
NSLog(@"PAN!");
}
您可以从GitHub下载此项目并运行它。