Fügen Sie ein mehrere Schaltflächen zu einer Ansicht programmatisch, die gleiche Methode aufrufen, festzustellen, welche Taste es war

StackOverflow https://stackoverflow.com/questions/2646297

Frage

Ich mag programmatisch mehrere UIButtons zu einer Ansicht hinzufügen -. Die Anzahl der Tasten ist nicht bekannt, bei der Kompilierung

Ich kann ein oder mehrere UIButton das machen wie so (in einer Schleife, aber der Einfachheit halber verkürzt):

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];

Kopiert / Herausgegeben von diesem Link: Wie erstelle ich eine grundlegende UIButton programmatisch?

Aber wie ich in ButtonClicked bestimme: welche Taste angeklickt wurde? Ich möchte Tag-Daten zu übergeben, wenn möglich, die Taste zu identifizieren.

War es hilfreich?

Lösung

Sie könnten entweder einen Verweis halten auf die tatsächliche Schaltfläche Objekt irgendwo, die (wie ein Array) von Bedeutung oder die Tag-Taste auf etwas Nützliches (wie ein in einem anderen Datenfeld Offset). Zum Beispiel (mit dem Tag, da dies in der Regel muss sinnvoll ist):

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]);
}

Andere Tipps

Sie können einen Tag der Taste zuweisen.

button.tag = i;

Dann in -buttonClicked:, überprüfen Sie den Tag des Absenders:

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

Für das gibt anderen Tag zu jeder Taste & Verwendung Code wie folgt:

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

& Methode

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

und so weiter zu überprüfen, welche Taste aufgerufen wird,

Wenn Sie Tasten zur Laufzeit hinzugefügt werden sollen, dann wird es als die 10 20 50 oder mehr betragen. Dann sollten Sie ui zu verwenden, blättern Sie in diesem Zustand anzuzeigen.

Wenn die Tasten dann sollten Sie Ihre Scroll-Ansicht erzeugen wird Größe entsprechend erhöht werden.

Und Sie können den Code wie dieser

schreiben
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];
        }

UIButton hat eine tag Eigenschaft. Verwenden Sie, dass und in Ihrem buttonClicked Methode können Sie auf die Schaltfläche überprüfen, die basierend auf seinen Tag geklickt wurde. Vielleicht möchten Konstanten halten um für welche Taste was.

Für jede Ihrer Knöpfe setzen einen entsprechenden Tag, und dann mit dem Tag in Ihrer Aktion beziehen. d.

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

Sie können einfach den Tag-Satz auf dem Index Ihrer Iteration basiert, wenn Sie Tasten in einer Schleife sind zu schaffen. Und dann in Ihrer Aktion:

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

Jemand könnte dieses Problem hat:

Jason Coco Antwort funktionierte gut für mich, bis ich den Tag Zugriffseigenschaften von einem NSArray verwenden wollte, die als eine Eigenschaft definiert wurde.

Stellt sich heraus, das Eigentum werden musste als „behalten“ anstelle von „schwach“.

Die Swift-Version (mit Etikett):

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

Anruf mit Verwendung self.viewWithTag (i) als UILabel:

(cell.viewWithTag(5) as UILabel).text
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top