制作UIButton复选框的最佳方法是什么?

时间:2010-02-09 07:06:19

标签: iphone objective-c checkbox uibutton

我正在尝试使用标题和图片从UIButton为我的iPhone应用制作标准复选框。按钮图像在“未选中”图像和“已检查”图像之间切换。

首先,我尝试了对UIButton进行子类化,但UIButton没有-init***方法在我的-init方法中使用。

这样做的最佳方式是什么?

提前致谢。

9 个答案:

答案 0 :(得分:42)

您不需要继承UIButton类。通过设计,Objective-C有利于组合而不是继承。

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

你可以将一个动作附加到按钮的内部事件中,并在那里执行切换,如下所示:

// 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
}

答案 1 :(得分:7)

在按钮中设置图像:

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

现在你需要做的就是:

button.selected = state

将显示正确的图像。

答案 2 :(得分:5)

您需要做的就是为状态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];
}

答案 3 :(得分:4)

对于任何对未来感兴趣的人 - 不要自己动手,只需从GitHub下载下面的链接,它已经从UIControl继承了它,并且完美地作为复选框运行。还包括一个关于它易于使用的示例项目:

https://github.com/Brayden/UICheckbox

答案 4 :(得分:1)

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

https://github.com/Marxon13/M13Checkbox

答案 5 :(得分:0)

您是否尝试重写initWithCoder方法,以防它以某种方式从nib加载?

答案 6 :(得分:0)

    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

}

您可以使用谷歌图标

的图像

答案 7 :(得分:0)

试试这个: -

-(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];

    } 
}

答案 8 :(得分:0)

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