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は、ビューではなく、View Controller にあります。ターゲットをself次のように設定する必要があります。

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

EDIT(質問の編集に応じて)omzが正しく指摘したように、あなたはの終了TaskViewController時に解放されます。これに対処するには、次の 2 つの方法があります。BoardViewControllerviewDidLoad:

  • 、またはhandlePanのコードとともに、メソッドを親View Controllerに折りたたみますviewDidLoad:
  • TaskViewController *taskAローカル変数にするのではなく、 のインスタンス変数を作成します。
于 2012-08-12T13:33:32.560 に答える
0

これは、Gesture Recognizer を使用する私の方法です。この方法は簡単でリスクが低いと思います。

最初に、Gesture Recognizer をビューにドラッグ アンド ドロップします。

ss

次に、Gesture Recognizer アイコンをコードに配線します。

ss

最後に、この IBAction のコードを次のように記述します。

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

このプロジェクトは GitHub からダウンロードして実行できます。

https://github.com/weed/p120812_PanGesture

于 2012-08-12T13:39:21.317 に答える