0

私はここでちょっと困惑しています。ユーザーがUIModalPresentationFormSheetフォーム シートの外側の任意の場所を選択した場合にフォーム シートを閉じる処理を行うジェスチャ レコグナイザーを追加しました。フォーム シートの上部にあるナビゲーション バーにもキャンセル ボタンがあります。ユーザーがフォーム シートの外側の任意の場所を選択してジェスチャ レコグナイザーを使用してフォーム シートを閉じると、すべてが正常に機能します。しかし、ジェスチャ認識エンジンを無視してキャンセル ボタンを使用すると、フォーム シートが閉じられると、以下のエラーが発生します。handleTapBehind メソッドに送信されるレコグナイザーからだと思います。viewWillAppearビューが閉じられたときに、割り当て解除されたメソッドにレコグナイザーを割り当てている を呼び出すべきではないため、理由がわかりません( handleTapBehind)。

エラー:

[CallWebViewViewController handleTapBehind:]: 割り当て解除されたインスタンス 0x21ee5db0 に送信されたメッセージ

コード:

- (void)viewDidAppear:(BOOL)animated {

[super viewDidAppear:animated];

if(UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM())
{
    if(![self.view.window.gestureRecognizers containsObject:recognizer])
    {
        recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapBehind:)];

        [recognizer setNumberOfTapsRequired:1];
        recognizer.cancelsTouchesInView = NO;
        [self.view.window addGestureRecognizer:recognizer];
    }
}
}

- (void)handleTapBehind:(UITapGestureRecognizer *)sender {

if (sender.state == UIGestureRecognizerStateEnded)
{
    CGPoint location = [sender locationInView:nil];

    if (![self.view pointInside:[self.view convertPoint:location fromView:self.view.window] withEvent:nil])
    {
        [self dismissViewControllerAnimated:YES completion:nil];
        [self.view.window removeGestureRecognizer:recognizer];
    }
}
}
4

1 に答える 1

1

viewController の viewWillDisappear に以下を追加します。

recognizer.delegate=nil;

お役に立てれば。

PS: 最後の文がわかりません:

ビューが閉じられたときに、割り当て解除されたメソッド(handleTapBehind)に認識機能を割り当てているviewWillAppearを呼び出すべきではないため、理由はわかりません。

特に「割り当て解除されたメソッドにレコグナイザーを割り当てていますか」?

于 2012-10-20T18:42:55.527 に答える