【问题标题】:What is the best way to make a UIButton checkbox?制作 UIButton 复选框的最佳方法是什么?
【发布时间】:2018-03-09 20:21:53
【问题描述】:

我正在尝试从 UIButton 为我的 iPhone 应用程序制作一个带有标题和图像的标准复选框。按钮图像在“未选中”图像和“选中”图像之间切换。

起初我尝试子类化UIButton,但UIButton 没有-init*** 方法可用于我的-init 方法。

最好的方法是什么?

提前致谢。

【问题讨论】:

    标签: iphone objective-c checkbox uibutton


    【解决方案1】:

    您不需要继承 UIButton 类。按照设计,Objective-C 更倾向于组合而不是继承。

    UIButtonUIControl 的子类,它具有selected 属性。您可以使用此属性来切换复选框的开/关行为,就像 UISwitch 一样。

    您可以将一个动作附加到按钮的 touch up inside 事件,并在那里执行切换,如下所示:

    // when you setup your button, set an image for the selected and normal states
    [myCheckBoxButton setImage:checkedImage forState:UIControlStateSelected];
    [myCheckBoxButton setImage:nonCheckedImage forState:UIControlStateNormal];
    
    - (void)myCheckboxToggle:(id)sender
    {
        myCheckboxButton.selected = !myCheckboxButton.selected; // toggle the selected property, just a simple BOOL
    }
    

    【讨论】:

    • 你也可以用一行代码来做这件事。 myCheckboxButton.selected = !myCheckboxButton.selected
    • 您可以通过为按钮状态 UIControlStateSelected 设置图像来避免 if-else ;)
    • @Diziet 你可以像这样使用 XOR 获得更多的hackish:myCheckboxButton.selected^=1;
    【解决方案2】:

    在按钮中设置图片:

    [button setImage:uncheckedImage forState:UIControlStateNormal]
    [button setImage:checkedImage forState:UIControlStateSelected]
    

    现在你需要做的就是:

    button.selected = state
    

    会显示正确的图像。

    【讨论】:

      【解决方案3】:

      您只需为状态UIControlStateNormalUIControlStateSelected 设置2 个不同的图像,然后在您的选择器中更改按钮的selected 属性。

      这是一个工作示例(将图像名称替换为您自己的名称):

      - (void)loadView {
          // ...
          UIButton *chkBtn = [UIButton buttonWithType:UIButtonTypeCustom];
          [chkBtn setFrame:CGRectMake(0, 0, 300, 25)];
      
          [chkBtn setImage:[UIImage imageNamed:@"UNCHECKED.png"] 
                  forState:UIControlStateNormal];
          [chkBtn setImage:[UIImage imageNamed:@"CHECKED.png"]
                  forState:UIControlStateSelected];
      
          [chkBtn addTarget:self 
                     action:@selector(chkBtnHandler:) 
           forControlEvents:UIControlEventTouchUpInside];
      
          // Optional title change for checked/unchecked
          [chkBtn setTitle:@"I am NOT checked!"
                  forState:UIControlStateNormal];
          [chkBtn setTitle:@"I am checked!"
                  forState:UIControlStateSelected];
      
          [self.view addSubview:chkBtn];
          [chkBtn release], chkBtn = nil;
          // ...
      }
      
      - (void)chkBtnHandler:(UIButton *)sender {
          // If checked, uncheck and visa versa
          [sender setSelected:!sender isSelected];
      }
      

      【讨论】:

        【解决方案4】:

        对于任何对未来感兴趣的人 - 与其自己做,只需从 GitHub 下载下面的链接,它已经从 UIControl 子类化并完美地用作复选框。还包括一个简单易用的示例项目:

        https://github.com/Brayden/UICheckbox

        【讨论】:

          【解决方案5】:

          我在我的一个项目中使用了 M13Checkbox。工作正常。

          https://github.com/Marxon13/M13Checkbox

          【讨论】:

            【解决方案6】:

            您是否尝试覆盖 initWithCoder 方法,以防万一它以某种方式从 nib 加载?

            【讨论】:

            • 真的不是答案。
            【解决方案7】:
                UIImage* nonCheckedImage=[UIImage imageNamed:@"ic_check_box_outline_blank_grey600_48dp.png"];//[UIImage init
                UIImage* CheckedImage=[UIImage imageNamed:@"ic_check_box_black_48dp.png"];//[UIImage init
            
                //ic_check_box_black_48dp.png
                [_checkBox setImage:CheckedImage forState:UIControlStateSelected];
                [_checkBox setImage:nonCheckedImage forState:UIControlStateNormal];
            }
            
            - (IBAction)checkBoxToggle:(id)sender {
                _checkBox.selected = !_checkBox.selected; // toggle the selected property, just a simple BOOL
            
            }
            

            你可以使用谷歌图标的图片

            【讨论】:

              【解决方案8】:

              试试这个:-

              -(IBAction)clickCheckButton:(UIButton *)sender {
              
                  if (sender.tag==0) {
              
                  sender.tag = 1;
              
                  [sender setImage:[UIImage imageNamed:@"check.png"] forState:UIControlStateNormal]; 
              
                  }else
              
                  {
              
                  sender.tag = 0;
              
                  [sender setImage:[UIImage imageNamed:@"uncheck.png"] forState:UIControlStateNormal]; } } sender.tag = 0;
              
                  [sender setImage:[UIImage imageNamed:@"uncheck.png"] forState:UIControlStateNormal];
              
                  } 
              }
              

              【讨论】:

              • 他不想尝试什么?
              • 我的意思是一个人并不总是想在没有解释的情况下尝试一些事情
              【解决方案9】:

              为什么不使用开关 - UISwitch?这用于显示显示值的布尔状态的元素。

              【讨论】:

                猜你喜欢
                • 2010-11-02
                • 2010-09-16
                • 2012-01-14
                • 2019-02-14
                • 1970-01-01
                • 2011-10-22
                • 2010-09-05
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多