0

touchesBeganからperformSelectorによって呼び出される独自のメソッドにタッチとイベントを渡す必要があります。NSInvocationを使用して引数をパッケージ化していますが、ターゲットに問題があります。

このようにする理由は、他のスクロールイベントを処理できるようにするためです。

これが私のコードです:

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{           
    UITouch *theTouch = [touches anyObject];

    switch ([theTouch tapCount]) 
    {
        case 1:
            NSInvocation *inv = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector:@selector(handleTap: withEvent:)]];
            [inv setArgument:&touches atIndex:2];
            [inv setArgument:&event atIndex:3];
            [inv performSelector:@selector(invokeWithTarget:) withObject:[self target] afterDelay:.5];
            break;
    }
}

handleTapは次のように定義されます。

-(IBAction)handleTap:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [super touchesBegan:touches withEvent:event];
}

私の問題は、コンパイルすると警告が表示されることです。

'CategoryButton'多くは'-target'に応答しません

実行すると、次のようにクラッシュします。

-[CategoryButtonターゲット]:認識されないセレクターがインスタンス0x5b39280に送信されました

私は、ターゲットがここで何をしようとしているのか、そしてそれがどのように設定されているのかを本当に理解していないことを認めなければなりません。

ご協力いただきありがとうございます。

4

2 に答える 2

2

コードを 1 行ずつ注意深く読むには時間がかかると思います。

[inv performSelector:@selector(invokeWithTarget:) withObject:[self target] afterDelay:.5];

これはあなたが思っていることをしていません。このメソッドが実行されてから 0.5 秒後に、次のことが起こります。

[inv invokeWithTarget:[self target]];

まず、あなたのクラスCategoryButtonには というメソッドがありませんtarget。第二に、なぜ遅れたのですか?これらのタッチをスクロールに使用している場合、0.5 秒の遅延はユーザーにとって非常に苦痛になります。

なぜ NSInvocation クラスを使用しているのですか? 本当に遅延が必要な場合は、インスタンスでperformSelector:メソッドを使用するだけです。CategoryButton

NSArray *params = [NSArray arrayWithObjects:touches, event, nil];
[self performSelector:@selector(handleTap:) withObject:params afterDelay:0.5];

performSelector:メソッドがサポートする引数は 1 つだけなので、NSArray でラップする必要があることに注意してください。(または、NSDictionary を使用することもできます。)

handleTap:NSArray/NSDictionary を受け入れるようにメソッドを更新し、必要に応じて引数を取得する必要があります。

ただし、遅延が必要ない場合は、自分でメソッドを呼び出してみませんか。

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{           
    UITouch *theTouch = [touches anyObject];

    switch ([theTouch tapCount]) 
    {
        case 1:
            [super touchesBegan:touches withEvent:event];
        break;
    }
}

たぶん私はあなたの意図を誤解していますが、あなたはこの方法を必要以上に複雑にしているようです.

于 2011-02-13T18:41:34.180 に答える
0

ここでターゲットが何をしようとしているのか、どのように設定されているのか、よくわかりません。

ターゲットは、呼び出しを実行するオブジェクトです。[self]選択したオブジェクトがメッセージに応答しないため、クラッシュが発生していtargetます。何を渡す必要があるかについて少し混乱しただけかもしれません。

target現在のコードでは、呼び出しを のプロパティで実行するように求めていますself。あなたはおそらくこれをしたくないでしょう - 私はあなたの呼び出しが単純に実行されることを望んでいると思いますself. その場合、これを使用します:

[inv performSelector:@selector(invokeWithTarget:) withObject:self afterDelay:.5];
于 2011-02-13T18:39:04.947 に答える