web-dev-qa-db-ja.com

プログラムでビューに複数のボタンを追加し、同じメソッドを呼び出して、どのボタンだったかを判断します

複数のUIButtonをプログラムでビューに追加したい-ボタンの数はコンパイル時に不明です。

1つまたは複数のUIButtonをそのように作成できます(ループ内ですが、簡単にするために短絡しています)。

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self 
       action:@selector(buttonClicked:)
forControlEvents:UIControlEventTouchDown];
[button setTitle:@"Button x" forState:UIControlStateNormal];
button.frame = CGRectMake(100.0, 100.0, 120.0, 50.0);
[view addSubview:button];

このリンクからコピー/編集: プログラムで基本的なUIButtonを作成するにはどうすればよいですか?

しかし、buttonClickedでどのように判断するのですか:どのボタンがクリックされたのでしょうか?可能であれば、ボタンを識別するためにタグデータを渡したいです。

28

実際のボタンオブジェクトへの参照を重要な場所(配列など)に保持するか、ボタンのタグを何か有用なもの(他のデータ配列のオフセットなど)に設定することができます。例(タグを使用します。これは一般的に有用である必要があるためです):

for( int i = 0; i < 5; i++ ) {
  UIButton* aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  [aButton setTag:i];
  [aButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
  [aView addSubview:aButton];
}

// then ...

- (void)buttonClicked:(UIButton*)button
{
  NSLog(@"Button %ld clicked.", (long int)[button tag]);
}
46
Jason Coco

ボタンにタグを割り当てることができます。

button.tag = i;

その後、-buttonClicked:、送信者のタグを確認します。

-(void)buttonClicked:(UIButton*)sender {
   int tag = sender.tag;
   ...
}
7
kennytm

私はこれが最良の答えだと思います:-
http://conecode.com/news/2012/05/ios-how-to-create-a-grid-of-uibuttons/

3
Nico

実行時にボタンを追加する場合は、10 20 50以上があります。次に、この状態でUIスクロールビューを使用する必要があります。

ボタンが生成されると、それに応じてスクロールビューのサイズを大きくする必要があります。

そして、あなたはこのようなコードを書くことができます

scrollview = [[UIScrollView alloc] init];      
        scrollview.contentSize = CGSizeMake(INVOICE_ADDITEM_SCROLLVIEW_CONTENT_WIDTH, INVOICE_ADDITEM_SCROLLVIEW_CONTENT_HEIGHT);
        scrollview.frame = CGRectMake(0,50, SCROLLVIEW_WIDTH, SCROLLVIEW_HEIGHT);
        //  scrollview.backgroundColor = [UIColor whiteColor];
        scrollview.scrollsToTop = NO;
        scrollview.delegate = self;
        [self.view addSubview:scrollview];


  for (int pos = 0; pos < 2; pos++) {
            UIButton *but = [UIButton buttonWithType:UIButtonTypeCustom];
            [but setImage:[UIImage imageNamed:@"checkbox.png"] forState:UIControlStateNormal];
            [but setImage:[UIImage imageNamed:@"checkbox_active.png"] forState:UIControlStateSelected];
            [but setFrame:CGRectMake(TXT_FLD_X_CORD+90, 295, 20, 20)];
            //            [but setCenter:CGPointMake( 50,  i*40+20 )];
            but.tag = pos;
            /*if(pos==0)
            {
            [but setImage:[UIImage imageNamed:@"checkbox_active.png"] forState:UIControlStateNormal];
           // [but setImage:[UIImage imageNamed:@"checkbox_active.png"] forState:UIControlStateSelected];
            }*/
            [but setCenter:CGPointMake(pos*90+125 ,310)];
            [but addTarget:self action:@selector(checkboxButton:) forControlEvents:UIControlEventTouchUpInside];
            [scrollview addSubview:but];
        }
1
Akram Khan

そのためには、各ボタンに異なるタグを付け、次のようなコードを使用します。

[btn1 addTarget:self action:@selector(pressbtn:) forControlEvents:UIControlEventTouchUpInside];   
   [btn2 addTarget:self action:@selector(pressbtn:) forControlEvents:UIControlEventTouchUpInside];

&メソッド

-(void)pressbtn:(id)sender    {
 UIButton *button=sender;
        if (button.tag==1)
{
  NSLog(@"Press button 1");
}
    if (button.tag==2)
{
  NSLog(@"Press button 2");
}

どのボタンが呼び出されるかを確認するなど

1
Aakil Ladhani

UIButtonにはtagプロパティがあります。それを使用して、buttonClickedメソッドで、タグに基づいてクリックされたボタンを確認できます。どのボタンが何であるかについて、定数を保持したい場合があります。

0
Kaili

Swiftバージョン(ラベル付き):

 for index in 1...5 {
      var label = UILabel()
      label.tag = index
      labelsDictionary["Label\(index)"] = label
      self.addSubview(label)
    }

Self.viewWithTag(i)をUILabelとして使用して呼び出します。

(cell.viewWithTag(5) as UILabel).text
0
ericgu

ボタンごとに適切なタグを設定し、アクション内のタグを参照します。つまり.

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
...
button.tag = 1
[view addSubview:button]; 

ループ内にボタンを作成する場合、反復のインデックスに基づいてタグを簡単に設定できます。そして、あなたの行動で:

- (void)aButtonWasTapped:(UIButton *)source {
    if( source.tag == 1 ) {
        // etc
    }
}
0
dannywartnaby

誰かがこの問題を抱えている可能性があります。

Jason Coco's answerは、タグを使用して、プロパティとして定義されたNSArrayのプロパティにアクセスするまで、うまくいきました。

プロパティは、「弱」ではなく「保持」として定義する必要がありました。

0
juggler