1

要するに、ナビゲーションコントローラーのタイトルバーのタッチを検出したいのですが、実際にタッチをキャッチするのに問題があります!

それが違いを生むならば、すべてはIBなしで行われます。

アプリデリゲートの.mファイルには次のものが含まれています。

MyViewController *viewController = [[MyViewController alloc] init];
navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[window addSubview:navigationController.view];

ナビゲーションバーのみを表示したまま、navigationControllerをオーバーレイする方法で、このウィンドウに追加された他のいくつかのサブビューがあります。

MyViewControllerはUIViewControllerのサブクラスであり、その.mファイルには次のものが含まれています。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
 for (UITouch *touch in touches) {
  NSLog(@"ended\n");
 } 

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 for (UITouch *touch in touches) {
  NSLog(@"began\n");
 } 
}

また、これらの関数をアプリデリゲートの.mファイルに直接配置しようとしましたが、コンソールが空白のままです。

私は何が間違っているのですか?

4

5 に答える 5

7

良いアイデアがなかったので、別のサブビューをアプリに追加しました。透明な色で、ナビゲーション バーのタイトルの上にプログラムで配置し、関連するタッチ メソッドをオーバーライドしてそのビューのカスタム クラスを使用しました。正常に動作しますが、もっとエレガントなソリューションがあればいいのにと思います。

于 2010-06-14T17:38:21.163 に答える
5

ビュー コントローラーは、マネージド ビューとスーパービューの間のレスポンダー チェーンに挿入されます。

ビュー コントローラーは、管理するビューに密接にバインドされているため、イベントの処理に使用されるレスポンダー チェーンの一部でもあります。ビュー コントローラーは、それ自体が UIResponder クラスの子孫であり、マネージ ビューとそのスーパービューの間のレスポンダー チェーンに挿入されます。したがって、View Controller によって管理されるビューがイベントを処理しない場合、View Controller にイベントが渡されます。View Controller は、イベントを処理するか、ビューのスーパービューに転送するかを選択できます。

( UIViewController のドキュメント)

コントローラーの管理ビューがすべてのイベントを食べている可能性はありますか? どんな景色ですか?

于 2010-06-14T16:58:14.683 に答える
4

私のカスタムビューはビュー階層の奥にあったため、これに問題がありました。UIViewController代わりに、レスポンダ チェーンを;が見つかるまで登りました。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // Pass to top of chain
    UIResponder *responder = self;
    while (responder.nextResponder != nil){
        responder = responder.nextResponder;
        if ([responder isKindOfClass:[UIViewController class]]) {
            // Got ViewController
            break;
        }
    }
    [responder touchesBegan:touches withEvent:event];
}
于 2012-06-22T12:29:51.933 に答える
2

メソッド userInteractionEnabled = YES を UIImageView に追加してみてください

于 2012-04-25T17:04:34.143 に答える
0

これらのメソッドは、UIViewControllers ではなく UIView サブクラスに配置する必要があります...UIView はタッチ コールバックを受け取ります。次に、UIView でプロトコルを作成し、UIViewController で実装して、タッチ時に UIViewController がコールバックを受け取るようにします。イベントが発生します...プロトコルと、それらを定義して実装する方法について説明するリンクがありますProtocols Ref

于 2010-06-14T17:39:42.743 に答える