Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UIgestureRecognitor导致“错误”;EXC“不良访问”;错误_Objective C_Ios_Uigesturerecognizer - Fatal编程技术网

Objective c UIgestureRecognitor导致“错误”;EXC“不良访问”;错误

Objective c UIgestureRecognitor导致“错误”;EXC“不良访问”;错误,objective-c,ios,uigesturerecognizer,Objective C,Ios,Uigesturerecognizer,使用连接到视图的手势识别器会触发我的应用程序崩溃,出现EXC_BAD_ACCESS错误。以下是相关课程 •BoardViewController-在AppDelegate中显示设置为rootViewController的板(作为背景)。它实例化“TaskViewcontroller”的多个对象 •TaskViewController-一个独立框,显示在电路板上。它应该是可拖动的。因此,我将UIPangestureRecognizer附加到它的视图中 - (void)viewDidLoad {

使用连接到视图的手势识别器会触发我的应用程序崩溃,出现EXC_BAD_ACCESS错误。以下是相关课程

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

TaskViewController-一个独立框,显示在电路板上。它应该是可拖动的。因此,我将UIPangestureRecognizer附加到它的视图中

- (void)viewDidLoad
{
    [super viewDidLoad];

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

- (void)handlePan:(UIPanGestureRecognizer *)recognizer {
    NSLog(@"PAN!");
}
.xib文件是一个简单的视图


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

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

UIPanGestureRecognizer* panRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)];
EDIT(回答问题的编辑)如前所述,您的
TaskViewController
BoardViewController
ViewDiLoad:
退出时释放。有两种处理方法:

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

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

      首先,将手势识别器拖放到视图中

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

      最后,您将为此iAction编写如下代码:

      - (IBAction)handlePan:(id)sender {
          NSLog(@"PAN!");
      }
      
      您可以从GitHub下载这个项目并运行它


      谢谢你的留言。我纠正了这个。但是现在我得到了一个“EXC_BAD_ACCESS”错误。有什么想法吗?ARC会在
      viewdiload
      方法的末尾释放你的
      taskA
      视图控制器(因为你没有任何其他引用),因此目标无效。哦,是的,对了。最好的方法是什么?创建一个NSMutableArray来存储对正在实例化的所有任务对象的引用?我添加了一个数组来保留对TaskView的引用(本例中为taskA)。我相应地更新了代码。我仍然收到“EXC\u BAD\u ACCESS”错误。谢谢。然而,正如前面提到的,我真的更喜欢用代码来完成它。此外,我不使用故事板。:)
      UIPanGestureRecognizer* panRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)];
      
      - (IBAction)handlePan:(id)sender {
          NSLog(@"PAN!");
      }