【问题标题】:Fetching the tag values on selector获取选择器上的标签值
【发布时间】:2013-12-14 13:24:39
【问题描述】:

我正在处理 iphone 项目。在那我添加了 3 个具有相同选择器名称的按钮(即动作)。现在我正在使用查询从数据库中获取数据。但只有当我按下三个按钮中的任何一个时,它才会向我显示第三个按钮的数据。

btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(80, 30, 200, 50);
[btn.layer setBorderWidth:0];
btn.tag = 1;
[btn setTitle:@"1" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(detail:) forControlEvents:UIControlEventTouchUpInside];
btn.titleLabel.font = [UIFont fontWithName:@"Zapfino" size:14.0];
[scrollview addSubview:btn];


btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(80, 30, 200, 50);
[btn.layer setBorderWidth:0];
btn.tag = 2;
[btn setTitle:@"2" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(detail:) forControlEvents:UIControlEventTouchUpInside];
btn.titleLabel.font = [UIFont fontWithName:@"Zapfino" size:14.0];
[scrollview addSubview:btn];


btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(80, 30, 200, 50);
[btn.layer setBorderWidth:0];
btn.tag = 3;
[btn setTitle:@"3" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(detail:) forControlEvents:UIControlEventTouchUpInside];
btn.titleLabel.font = [UIFont fontWithName:@"Zapfino" size:14.0];
[scrollview addSubview:btn];

这是我正在使用的操作。

-(IBAction)detail:(id)sender
{
    detailViewController *detailvc =[[detailViewController alloc]initWithNibName:@"detailViewController" bundle:Nil];
     detailvc.btntxt = btn.tag;
    NSLog(@"name of btn :%ld",(long)btn.tag);
    [self.navigationController pushViewController:detailvc animated:YES];
}

在 nslog 中,我也只获得了第三个按钮的选项卡 请帮我解决这个问题...

【问题讨论】:

  • 你不应该对所有 3 个按钮使用相同的标签
  • 抱歉,我错误地使用了不同的标签值.....
  • 所有这些按钮都在同一个位置吗? CGRectMake(80, 30, 200, 50)?请粘贴您的原始代码,以便每个人都可以看到问题所在

标签: ios tags uibutton


【解决方案1】:

您正在为按钮分配 1 个标签

btn.tag = 1;

为每个按钮添加不同的标签

--

同样在您的detail: 中,从发件人那里获取标签,而不是您的实例变量

 - (IBAction)detail:(UIButton *)sender {
    detailViewController *detailvc =[[detailViewController alloc]initWithNibName:@"detailViewController" bundle:Nil];
    detailvc.btntxt = sender.tag;
    NSLog(@"name of btn :%ld",(long) sender.tag);
    [self.navigationController pushViewController:detailvc animated:YES];
}

【讨论】:

  • 所以投票并将您的问题标记为已解决,以便哈尼获得他的声誉;-)
【解决方案2】:

您将所有 3 个按钮的标记号设置为相同的值 (1)。如果您希望能够区分按钮,则需要使用不同的值。

第一个按钮使用标签 1,第二个按钮使用标签 2,第三个按钮使用标签 3。

【讨论】:

  • 我认为问题已经在使用三个不同的标签作为 1,2 和 3。主要问题是 btn 对象只是单一的。所有三个标签都已分配给一个signle对象,这就是最后一个标签被反映的原因。
【解决方案3】:

使用sender 变量获取触发动作的按钮:

-(IBAction)detail:(id)sender
{
    UIButton *button = (UIButton *)sender;
    NSInteger buttonTag = button.tag;
    // etc
}

另外,给每个按钮它自己的标签

btn.tag = 2; // and 3

并且不要在 action 方法中使用btn 变量。它只会包含最后设置的变量,在这种情况下是第三个按钮。

【讨论】:

  • 所有按钮实例也是相同的,即btn。理想情况下应该使用三个不同的变量。
  • @BalramTiwari 我认为这不会有什么不同。每个新按钮都由addSubview 提供给滚动视图。该变量可以毫无问题地重复使用。 btn 似乎是 ivar 的面孔是一个问题(应该是方法变量)。
  • 哦,对了。同意,btn 应该是方法本地的。
【解决方案4】:

只需使用((UIButton)sender).tag 而不是btn.tag

【讨论】:

  • 我猜你错过了* 请更新为 ((UIButton * )sender).tag 因为我无法编辑。
【解决方案5】:

您的代码的主要问题是您只使用单个按钮对象(& 将其初始化 3 次 & 添加三个不同的标签并将其添加到子视图。),它看起来像一个 ivar。

因此,即使您向单个对象实例添加了三个不同的标签,最近的标签也会被反映出来,因此您始终只会获得 3 个标签。

btn = [UIButton buttonWithType:UIButtonTypeCustom];
....
btn.tag = 1;
.
.
btn = [UIButton buttonWithType:UIButtonTypeCustom];
...
btn.tag = 2;
.
.
btn = [UIButton buttonWithType:UIButtonTypeCustom];
...
btn.tag = 3

相反,您要么在目标方法中不使用 btn 对象,要么可以使用三个不同的按钮来更好地理解。

UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom];
btn1.frame = CGRectMake(80, 30, 200, 50);
....
btn1.tag = 1;
.
.
UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeCustom];
btn2.frame = CGRectMake(80, 80, 200, 50);
...
btn2.tag = 2;
.
.
UIButton* btn3 = [UIButton buttonWithType:UIButtonTypeCustom];
btn3.frame = CGRectMake(80, 130, 200, 50);
...
btn3.tag = 3

剩下的你需要修改目标方法的代码为

-(IBAction)detail:(UIButton *)sender
{
    detailViewController *detailvc =[[detailViewController alloc]initWithNibName:@"detailViewController" bundle:Nil];
     detailvc.btntxt = sender.tag;
    NSLog(@"name of btn :%ld",(long)sender.tag);
    [self.navigationController pushViewController:detailvc animated:YES];
}

我希望这对你有帮助。

【讨论】:

    【解决方案6】:
    -(IBAction)detail:(UIButton*)sender
    {  
     if(sender.tag==1)
     {
    
     }
     else if(sender.tag==2)
     {
    
     }
     else if(sender.tag==3)
     {
    
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-23
      • 2014-03-22
      • 2017-05-04
      • 2013-07-15
      • 1970-01-01
      • 2013-04-30
      • 2011-11-22
      • 1970-01-01
      相关资源
      最近更新 更多