【发布时间】:2018-03-09 20:21:53
【问题描述】:
我正在尝试从 UIButton 为我的 iPhone 应用程序制作一个带有标题和图像的标准复选框。按钮图像在“未选中”图像和“选中”图像之间切换。
起初我尝试子类化UIButton,但UIButton 没有-init*** 方法可用于我的-init 方法。
最好的方法是什么?
提前致谢。
【问题讨论】:
标签: iphone objective-c checkbox uibutton
我正在尝试从 UIButton 为我的 iPhone 应用程序制作一个带有标题和图像的标准复选框。按钮图像在“未选中”图像和“选中”图像之间切换。
起初我尝试子类化UIButton,但UIButton 没有-init*** 方法可用于我的-init 方法。
最好的方法是什么?
提前致谢。
【问题讨论】:
标签: iphone objective-c checkbox uibutton
您不需要继承 UIButton 类。按照设计,Objective-C 更倾向于组合而不是继承。
UIButton 是UIControl 的子类,它具有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
myCheckboxButton.selected^=1;
在按钮中设置图片:
[button setImage:uncheckedImage forState:UIControlStateNormal]
[button setImage:checkedImage forState:UIControlStateSelected]
现在你需要做的就是:
button.selected = state
会显示正确的图像。
【讨论】:
您只需为状态UIControlStateNormal 和UIControlStateSelected 设置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];
}
【讨论】:
对于任何对未来感兴趣的人 - 与其自己做,只需从 GitHub 下载下面的链接,它已经从 UIControl 子类化并完美地用作复选框。还包括一个简单易用的示例项目:
【讨论】:
我在我的一个项目中使用了 M13Checkbox。工作正常。
【讨论】:
您是否尝试覆盖 initWithCoder 方法,以防万一它以某种方式从 nib 加载?
【讨论】:
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
}
你可以使用谷歌图标的图片
【讨论】:
试试这个:-
-(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];
}
}
【讨论】:
为什么不使用开关 - UISwitch?这用于显示显示值的布尔状态的元素。
【讨论】: