1

私は次のことをしました:

 buttonPlaylistView = [[UIButton alloc] initWithFrame:CGRectMake(self.view.frame.size.width *(urlList.count+1), 0, self.view.frame.size.width, self.view.frame.size.height)];
            buttonPlaylistView.tag = 0;

 UITapGestureRecognizer *doubleTap3 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
            [doubleTap3 setNumberOfTapsRequired:2];
            [buttonPlaylistView addGestureRecognizer:doubleTap3];
            [doubleTap3 release];

-(void) handleDoubleTap:(UITapGestureRecognizer *)sender{
    if(sender.state == UIGestureRecognizerStateEnded)

    int x = [sender tag];
    return;
}

しかし、私SIGAGRTはこの行に到達します:int x = [sender tag];言っています:

[UITapGestureRecognizer tag]: unrecognized selector sent to instance 0x61280b0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITapGestureRecognizer tag]: unrecognized selector sent to instance 0x61280b0'

今:問題は何ですか、これに対する解決策は何ですか?ありがとう

4

4 に答える 4

12
-(void) handleDoubleTap:(UITapGestureRecognizer *)sender
{
    if(sender.state == UIGestureRecognizerStateEnded)
    {
      int x = [sender.view tag];
    }
}

問題を修正します。

于 2011-11-08T13:32:43.573 に答える
1

UITapGestureRecognizerには、tagという名前のプロパティがありません。ご覧のとおり、取得する送信者はボタンではありません次のように、 buttonPlayListViewに直接アクセスする必要があります。

int x = [buttonPlayListView tag];

または、アクセスするボタンを覚えておいてください。

于 2011-11-08T13:24:57.630 に答える
1

UIButtonにダブルタップジェスチャ認識機能を追加するという間違った方法でこれを行っていることは確かですが、必要なタスクを実行できる方法があります。 . コメントいただきました

たとえば100個のボタンを作成した場合、どうすれば覚えられますか

答えの1つに、SIGBARTを引き起こしている問題が何であるかを強調するものです。UIGestureRecognizer にはタグ プロパティがありません。

[セルフ ビュー] のすべてのサブビューを繰り返し処理し、同じ UIGestureRecognizer を持つサブビューを見つけることができます。これは最も美しい解決策ではありません。サブビューが多いほど、ループにかかる時間が長くなります。しかし、それはあなたが探しているように見えるので、追加する場合.

あなたの handleDoubleTap 関数では、次のことができます

-(void) handleDoubleTap:(UITapGestureRecognizer *)sender
{
    if(sender.state == UIGestureRecognizerStateEnded)
    {
        int iButtonTag = -1 //This is important later to escape the below for loop as we don't need to needlessly go around in circles
        for(UIView* psubView in [[self view] subviews])
        {
            if( [psubView isKindOfClass:[UIButton class]] )
            {
                UIButton* pButton = (UIButton*)psubView;
                for(UIGestureRecognizer* pGesture in [pButton gestureRecognizers] )
                {
                     if( pGesture == sender )//this is the button we're after
                     {
                         iButtonTag = [pButton tag];
                         break;
                     }
                }
                if( iButton != -1 )//found what we came for
                {
                    break;
                }
             }
        }
        //do what ever it was you needed to do now that you have the views tag, or you could have kept a reference to the button etc.
    }
 }

それはあなたの問題を解決するはずです。または、サブビューのサブビューにボタンを追加する場合は、 NSMutableArray で UIButtons を追跡することをお勧めします。これを行うには、クラス プロパティ (またはメンバー変数) を作成し、これを使用してボタンを追加します。 「addObject:」NSMutableArray の関数。次に、行の代わりに

for(UIView* psubView in [[self view] subviews])

上記で交換できます

for( UIButton* pButton in m_pMutableButtonArray )

ここで、「m_pMutableButtonArray」は、UIButtons を格納していた NSMutableArray に付けた変数名です。これは、次の行の isKindOfClass テストの場合、次を廃止することも意味します。

これで問題が解決するはずです。

于 2011-11-08T14:19:28.280 に答える
0

ボタンに UITapGestureRecognizer を配置するのはなぜですか? ボタンはすでにそれを処理しており、コールバックを送信します。この UIControl メソッドを使用してボタンにターゲットを追加できます。

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
于 2011-11-08T13:31:45.650 に答える