【问题标题】:IOS: one IBAction for multiple buttonsIOS:一个 IBAction 用于多个按钮
【发布时间】:2011-05-02 14:15:21
【问题描述】:

在我的项目中,我必须控制 40 个按钮的动作,但我不想创建 40 个 IBAction,我可以只使用一个 IBAction,如何?

【问题讨论】:

标签: ios objective-c ibaction


【解决方案1】:

如果您使用界面生成器来创建按钮,只需将它们指向相关类中的相同 IBAction。

然后,您可以通过读取按钮中的文本来区分 IBAction 方法中的按钮...

- (IBAction)buttonClicked:(id)sender {
    NSLog(@"Button pressed: %@", [sender currentTitle]);    
}

...或者通过在 Xcode 中设置tag 属性并通过[sender tag] 读回它。 (如果您使用这种方法,请从 1 开始标记,因为 0 是默认值,因此几乎没有用处。)

【讨论】:

  • 在使用情节提要的 Xcode 4.6 中存在一个错误,它不允许额外的连接。只需建立从按钮到代码的所有连接(添加IBACTION 方法,然后删除除一个之外的所有内容。
  • 刚刚意识到您还可以通过按住 CMD 并选择所有 UIButtons 来多选您在 IB 中创建的所有 UIButtons,然后 ctrl 将其拖动到代码中,它将创建一个包含所有内容的单个 IBAction连接到它的 UIButtons。
【解决方案2】:
-(IBAction)myButtonAction:(id)sender {
    if ([sender tag] == 0) {
        // do something here
    }
    if ([sender tag] == 1) {
        // Do something here
    }    
}

// in Other words

-(IBAction)myButtonAction:(id)sender {
        switch ([sender tag]) {
        case 0:
            // Do something here
            break;
        case 1:
           // Do something here
             break;
       default:
           NSLog(@"Default Message here");
            break;
}

【讨论】:

  • 如果使用这种方法,为了清晰起见,建议为每个标签添加一个 switch 语句和一个 typedef 枚举。
【解决方案3】:

将所有按钮设置为使用该一项操作。动作通常有一个sender 参数,您可以使用它来确定哪个按钮正在调用该动作。区分按钮的一种流行方法是为每个按钮的tag 属性分配不同的值。因此,您可能有 40 个按钮,其标签范围从 1 到 40。(0 可能不是标签的好选择,因为这是默认值,并且您忘记设置标签的任何按钮都将 0 作为标记值。)

当所有按钮的功能大致相同时,这种技术最有用,例如计算器或键盘上的按钮。如果每个按钮做的事情完全不同,那么你仍然会得到相当于 40 个方法的结果,但是你用你自己的 switch 语句代替了 Objective-C 的消息传递系统。在这种情况下,最好只花时间创建尽可能多的操作,并适当地分配它们。

【讨论】:

    【解决方案4】:

    当然。只需将所有按钮连接到 Interface Builder 中的相同操作方法。使用方法的sender 参数(可能与按钮的tag 属性结合使用)来识别哪个按钮正在发送事件。

    【讨论】:

      【解决方案5】:

      只需使用一个 IBAction 并将其分配给您的所有按钮。

      【讨论】:

        【解决方案6】:

        我自己只是用了上面的方法,有几个按钮,但都转换了,改用switch case

        -(IBAction)buttons:(id)sender
        {
        
            switch ([sender tag])
        
            {
        
                case 0 :
        
            }
        }
        

        【讨论】:

        • 如果是我,我会为每个按钮设置单独的操作,并将公共代码提取到一个单独的方法中,从每个按钮操作方法调用。这样做可以使代码更加简洁,每个按钮只有一个按钮动作关系,并避免使用开关,这通常是代码异味。
        • 当你只是想帮助别人时,被否决真的很不公平......有时答案是如此复杂,我们需要一些简单的东西来理解我们所问的问题。
        【解决方案7】:

        似乎您已获得所需的所有答案,但我想添加到其他所有人的答案中。

        您要使用一个 IBAction 还是 40 个操作取决于您希望按钮执行的操作。如果所有按钮都做完全不同的事情,您需要所有单独的 IBAction,但如果您希望所有按钮都做同样的事情,您可以只使用一个。我需要有关这些按钮和操作的更多详细信息,但您可能有每个按钮的标题,因此您可以使用它来区分每个按钮并创建一条消息或由按下的特定按钮自定义的内容。这是示例。每次按下按钮时,标签都会显示一条消息,上面写着“按下按钮的标题”。

        通过这种方式,您无需对所有 40 种模式进行 switch case。只需 2-3 行代码,您仍然可以通过按下按钮来显示或执行个性化的操作。

        - (IBAction)button_Clicked:(UIButton *)sender {
        
            //Get the buttons' titles.
            NSString *title =[sender titleForState:UIControlStateNormal];
        
            //Construct a message that includes the *title. 
            NSString *plainText=[NSString stringWithFormat:@"%@ button pressed.", title];
        
            //Assigns the *plainText to the label. 
            self.Label.text=plainText;
        
        }
        @end
        

        【讨论】:

          猜你喜欢
          • 2015-08-15
          • 2015-07-22
          • 1970-01-01
          • 2016-10-18
          • 1970-01-01
          • 1970-01-01
          • 2011-04-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多