私はここでちょっと困惑しています。ユーザーが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];
}
}
}