【问题标题】:How do I get the name from a UIButton?如何从 UIButton 获取名称?
【发布时间】:2014-04-25 20:08:58
【问题描述】:

我是 xcode 的新手,我正在尝试制作一个通用的按钮按下方法。我希望它检查按钮的名称(而不是标题),然后我想做一些字符串操作来设置一些值。

我的 ViewController.h 中有一个按钮设置

@property (strong, nonatomic) IBOutlet UIButton *button_1_3;

然后我的 ViewController.m 中有一个通用方法

- (IBAction)buttonPress:(id)sender
{
    UIButton *bSender = (UIButton *)sender;

    self.char1Text1.text = bSender.titleLabel.text; // this is the bit that I am not getting
}

所以我的一堆按钮上会有相同的文本,我想看到的是“button_1_3”。我希望有一个“bSender.name”选项,但我还没有找到它。

任何帮助将不胜感激

【问题讨论】:

  • 旁注:如果你的UIButton没有被其他类调用,则不需要设置为@property
  • 你想要变量名吗?如果是,我认为这是不可能的。指针(button_1_3)包含了内存中对象的地址,但是内存中的对象不知道有哪些指针引用了它。
  • 获取UIButton 名称有什么意义?如果要识别按下的是哪个UIButton,可以给每个按钮分配tag,通过bSender.tag获取tag的值
  • 基本上我想要一种从按钮解析信息的方法,这样我就可以按下一个通用按钮。因此,如果我有一个名为“button1A”、“button1B”和“button2A”的按钮。我想知道我必须将一个变量设置为数字 1 或 2,并将另一个变量设置为字母 A 或 B。
  • 为你的目的使用标签怎么样?

标签: ios objective-c uibutton


【解决方案1】:

给所有按钮一个标签(这也可以在 Interface Builder 中完成)

button_1_0.tag = 0;
button_1_1.tag = 1;
button_1_2.tag = 2;
button_1_3.tag = 3;

在您的 buttonPress: 方法中检查 tag 并显示不同的文本

- (IBAction)buttonPress:(id)sender
{
    UIButton *bSender = (UIButton *)sender;
    switch (bSender.tag) {
        case 0:
            self.char1Text1.text = @"first text";
            break;
        case 1:
            self.char1Text1.text = @"second text";
            break;
        case 2:
            self.char1Text1.text = @"thrid text";
            break;
        case 3:
            self.char1Text1.text = @"fourth text";
            break;
        default:
            break;
    }
}

【讨论】:

  • 多么糟糕的主意!出口集合总是在这里存储大量对象,而不是用稍微相似的名称弄乱千类变量......
  • 是原帖的命名。您可以随时在 IB 中设置标签。
【解决方案2】:

变量名称是为了便于开发,但在编译应用时不会保留。

您需要在按钮及其名称之间创建映射。实现此目的的一种简单方法是为每个按钮分配一个tag,然后创建标签和名称之间的映射。然后您可以通过_tagNameMapping[@(sender.tag)]; 获取名称。

此外,由于标签是数字,您可以switch(sender.tag) 并决定您的逻辑,如果您愿意的话。

【讨论】:

    【解决方案3】:

    只需调用下面的方法,它就会为您提供所需的:

    - (IBAction)buttonPress:(id)sender
    {
        NSString* str1 = [sender titleForState:UIControlStateNormal];
        NSLog(@"%@", str1);
    }
    

    【讨论】:

    • 嗯,OP提到所有按钮都有相同的标题,所以这无济于事。
    • “所有按钮”是什么意思?在大多数情况下,每个动作只有一个按钮作为它的发送者,所以这个方法将返回发送者的标题。再说一次,如果您需要一种方法来返回每个按钮名称,您可以查看我的“编辑前”回答方法!
    • 你读过这个问题吗?他想将所有按钮连接到相同的操作方法。这就是他需要区分按钮的原因。
    【解决方案4】:
    - (IBAction)buttonPress:(id)sender
    {
        UIButton *bSender = (UIButton *)sender;
        //uh, and don't forget to set button's outlet or it won't work
        if(bSender==self.button_1_3){
             //button pressed is button_1_3..do manipulation for that button.
        }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 2011-04-26
      • 2018-04-05
      • 2019-11-21
      • 2021-12-14
      相关资源
      最近更新 更多