1

レスポンダー チェーンに関する Apple ドキュメントを読みましたが、知りたいことがありました。タップされたオブジェクトを NSLog する方法は?

複数のビュー オブジェクトを持つ非常に複雑なビュー コントローラーがあるとします。オブジェクト (UIButton など) をタップするたびに、タップされた特定のオブジェクトを知る方法はありますか? ドキュメントは良い概要を提供しましたが、上書きする方法は明確ではありませんでした。

編集:状況は、私が書いていないさまざまなアプリをテストしています。タップされたオブジェクトをすばやく特定する方法が必要です (多くのアプリには、あるもののように見えても実際には別のカスタム コントロール/オブジェクトがあるため)。タッチイベントがUIAppicationに送信され、NSLogに送信されたときに、それを傍受する方法があることを望んでいました。

4

3 に答える 3

4

オーバーライド-[UIApplication sendAction:to:from:forEvent]して、必要なことを行うことができます。

@implementation MyApplicationSubclass

- (BOOL)sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event
{
    NSLog(@"Sending action %@ from sender %@ to target %@ for event %@", NSStringFromSelector(action), sender, target, event);
    return [super sendAction:action to:target from:sender forEvent:event];
}

@end

それをUIApplicationのカスタムサブクラスに入れます。次に、main.m で、UIApplicationMain()カスタム サブクラスが使用されるように呼び出しを変更します。

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, NSStringFromClass([MyApplicationSubclass class]), NSStringFromClass([AppDelegate class]));
    }
}

これは、このメカニズムを使用してアクションをターゲットに送信する UIControl サブクラスに対してのみ機能することに注意してください。アプリを通過するすべてのタッチ イベントを表示する場合は、-[UIApplication sendEvent:]代わりにオーバーライドします。その場合、どのオブジェクトがタッチを受けるかはあなた次第です。メインビュー/ウィンドウを呼び出すことでそれを行うことができますが-hitTest:、タッチが着地したビューを特定することはできますが、必ずしもどのビューがそれを処理するかはわかりません (たとえば、ビューはイベントを他のオブジェクトに転送できます)。このようなもの:

@implementation MyApplicationSubclass

- (void)sendEvent:(UIEvent *)event
{
    UIWindow *window = [self keyWindow];
    NSSet *touches = [event touchesForWindow:window];
    for (UITouch *touch in touches) {
        UIView *touchedView = [window hitTest:[touch locationInView:window] withEvent:event];
        NSLog(@"Touch %@ received in view %@ for event %@", touch, touchedView, event);
    }

    [super sendEvent:event];
}

@end
于 2012-12-12T23:05:07.703 に答える
1

ボタンの場合、通常、アクション メソッドにはそのパラメータがあり、

- (void)action:(id)sender {

ここで、sender はボタンを表します。次のように使用できます。

   UIButton *button = (UIButton *)sender;
   button.hidden = YES;//use the properties of button now

UITouch デリゲートメソッドで確認することもできます。

例:-

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
       UITouch *myTouch = [[event allTouches] anyObject];// or UITouch *touch = [touches anyObject];

       CGPoint point = [myTouch locationInView:myViewToCheck];
       if (CGRectContainsPoint(myViewToCheck.bounds, point) ) {
           //Touch detected on myViewToCheck.
       }
于 2012-12-12T22:23:57.320 に答える
0

https://github.com/domesticcatsoftware/DCIntrospectを見る機会はありましたか。

github から直接: Introspect は、UIKit で構築されたユーザー インターフェイスのデバッグを支援する iOS 用のツールの小さなセットです。

役立つ可能性のあるロギングコンポーネントがありますか?

于 2012-12-12T22:48:49.183 に答える