1

いくつかのUIBarButtonItemsを持つUIToolbarといくつかのUITextFieldsを含むUITableViewを持つビューがあります。

どこでもタップしてテキストフィールドのキーボードを閉じたいと思います。したがって、TapGestureRecognizer をビューに追加しました。TapgestureRecognizer が UIBarButtonItems のタップを処理しないようにするために、次のメソッドを追加しました (デリゲートが設定されています)。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    UIView *view = touch.view;
    while (view) {
         NSLog(@"Class of view: %@", NSStringFromClass([view class]));
         view = view.superview;
    }

    // Disallow recognition of tap gestures in the toolbar
    if ([touch.view isKindOfClass:[UIToolbar class]]) {
        return NO;
    }

    if ([touch.view.superview isMemberOfClass:[UIToolbar class]]) {
         return NO;
    }

    return YES;
}

UIBarButtonItem はビュー自体ではありませんが、スーパービューとして UIToolbar を持っています。上記の方法を使用すると、ツールバーのすべてのタップに対して isKindOfClass:[UIToolbar class] のチェックが機能しないようです。ただし、 isMemberOfClass:[UIToolbar class] を使用したスーパービューのチェックは機能します。

私はこれを理解していません。多分誰かがこの振る舞いを説明できますか?

4

1 に答える 1

0

プライベート ビュー クラスに関するビュー階層に依存しないでください。それはいつでも変わる可能性があります。

より良いアプローチは、ジェスチャをテーブル ビュー (または関心のある領域を表す他の適切なビュー) に追加することです。通常のテーブル操作をブロックしないように、適切なタイミングでジェスチャを有効または無効にしてください。

于 2013-08-23T10:03:31.890 に答える