【问题标题】:UIButton and actions problemUIButton 和动作问题
【发布时间】:2011-07-27 08:47:45
【问题描述】:

我正在动态创建一些 UIbutton。用户点击任何一个按钮都会显示一些东西(例如:不同的视图)。所以我成功地制作了按钮,得到了标签。但是在下面的IBAction方法中,因为所有这些按钮都是动态创建的。所以我不能使用 if, else if 语句来显示基于标签号的视图。我正在考虑使用循环?有什么想法吗?

这是我的代码:

NSMutableArray *buttonsArray = [[NSMutableArray alloc] initWithObjects:nil];

for(int i = 0; i < [someArray count]; i++)
{
      button = [[UIButton alloc] initWithFrame:CGRectMake(btnX,btnY,btnW,btnH)];

    button.tag = i;

    [buttonsArray addObject:button];

    [[buttonsArray objectAtIndex:i] addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

    button.titleLabel.text = [NSString stringWithFormat:@"Click it"];

    [self.view addSubview:button];

    btnY = btnY + 120;
}

`-(IBAction) buttonPressed:(id)sender `
{

    UIButton *btn = (UIButton *)sender;
    NSLog(@"%ld", btn.tag);

      //Don't know the number of buttons, so this is not gonna work
    if( btn.tag == 1)
    {
            //do something
    }
        if( btn.tag == 2)
    {
            //do something
    }
    if( btn.tag == 3)
    {
            //do something
    }
    if( btn.tag == 4)
    {
            //do something
    }

}

【问题讨论】:

  • 您希望在单击按钮时显示什么?
  • 可以使用switch语句代替if..else.if..条件
  • 在某些时候,您必须将您的实现映射到您创建的按钮。从代码中我可以看到您根据数组确定按钮的数量,这样您就知道有多少按钮。为什么没有一个字典,其中键是按钮标签,值是选择器或其他一些数据结构,可以指示您想要实现的目标。这样,当您获取按钮的标签时,只需从字典中获取键的值并使用它。这也意味着您不需要大量可怕的 if 语句或巨大的 switch 语句
  • 如果单击一个按钮,它将显示一个视图,如果单击另一个按钮,它将显示一个不同的视图
  • 对不起,凯文 :) 对此我深表歉意。

标签: iphone uibutton ibaction


【解决方案1】:

我认为循环在这里不是完美的解决方案...同意 Jennis...使用 switch 而不是 if else 语句...如果您想使用循环尝试:

-(IBAction) buttonPressed:(id)sender{
UIButton *selectedbtn = (UIButton *)sender;
for (UIButton *bttn in buttonsArray) {       
    if ([bttn.tag == selectedbtn.tag ) {
        //do something
    }
}

}

【讨论】:

  • 你可以只使用 if ([buttonsArray containsObject:sender]) 毕竟它只是一个 id 吗?这样你就可以完全省去 for 循环,但从根本上说,我不明白这会给你带来什么,你只是在确认一个按钮被添加到一个数组中,因为 OP 从实际数组本身设置目标和动作,当然是事实上,IBAction 被调用意味着它被添加到数组中
【解决方案2】:

你得到了多个 UIbutton ? b'因为你的 X 和 Y 对所有人都是一样的..

【讨论】:

  • 我认为他在循环的最后一条语句中这样做了 btnY = btnY + 120;
【解决方案3】:

除了两件事之外,您的代码一切正常。

(1) 更改按钮的坐标,使视图中所有按钮的位置不同。

(2) 修改如下代码:

[[buttonsArray objectAtIndex:i] addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

使用此代码:

[button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

如果需要任何进一步的帮助,请告诉我。

【讨论】:

  • 这没有回答问题。另外,由于他的按钮包含在数组中,因此添加目标的位置确实没有太大区别,他仍在将其添加到按钮中,我可能同意在添加到数组之前应该添加目标但他的问题是关于如何将标签链接到视图的加载而不是代码是否正确..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
相关资源
最近更新 更多