3

スタックに新しいビューをプッシュするかなり単純な UITableView があります。新しいビューには、このように初期化されるgestureRecognizerがあります

@synthesize swipeGestureLeft;


    - (void)viewDidLoad
{
        swipeGestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(toggleViewLeft)];
        swipeGestureLeft.numberOfTouchesRequired = 1;
        swipeGestureLeft.delegate=self;
        swipeGestureLeft.direction = (UISwipeGestureRecognizerDirectionLeft);
        [self.view addGestureRecognizer:swipeGestureLeft];
}

デリゲートメソッドも呼び出します

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

    if (viewShown==1) {
        return NO;
    }
    return YES;
}

そして、私が持っているdeallocメソッドで

- (void)dealloc {
    NSLog(@"I AM IN DEALLOC");


    swipeGestureLeft.delegate=nil;
    [self.view removeGestureRecognizer:swipeGestureLeft];
    swipeGestureLeft=nil;



}

私の.hファイルに

@interface MyViewController : UIViewController <UIGestureRecognizerDelegate>

テーブル ビューに戻るためにヒットすると、ビューの割り当てが解除されます (NSLog が起動するため、これを確認できます)。テーブル ビューを下にスワイプしようとすると、アプリがクラッシュします。

[MyViewController gestureRecognizer:shouldReceiveTouch:]: message sent to deallocated instance 

ビューの割り当てが解除された後にデリゲート メソッドが呼び出されないようにするにはどうすればよいですか。

4

1 に答える 1

7

解決済み: 新しい iOS7 navigationController.interactivePopGestureRecognizer を使用しており、そのデリゲートを "self" に設定していました。

割り当て解除時に、デリゲートを「nil」に設定できませんでした。swipeLeftGesture オブジェクトではなく、デリゲート呼び出しを保持していたのはこのオブジェクトでした (正しい言葉かどうかはわかりません)。dealloc でデリゲートを nil に設定するとうまくいきました。

于 2013-09-13T02:55:10.727 に答える