我正在我的应用程序中构建一个带有复选框的表单,当然,XCode库实际上并不提供复选框作为表单选项(疯狂);所以我创建了带有类似复选框(已选中/未选中)的图像的按钮。
那就是说,我的表格很长,需要20多个复选框 - 如果我理解正确,每个复选框都必须单独“连线”; 例如我的屏幕上有三个复选框,请参阅下面的代码...我无法想象必须为20个复选框做所有这些(更不用说3个!) - 有更好的方法吗这个?非常感谢帮助/建议。
·H
@interface PetRegistrationViewController : UIViewController {
BOOL checked1;
BOOL checked2;
BOOL checked3;
}
@property (weak, nonatomic) IBOutlet UIButton *checkboxButton;
@property (weak, nonatomic) IBOutlet UIButton *checkboxButton2;
@property (weak, nonatomic) IBOutlet UIButton *checkboxButton3;
- (IBAction)checkButton:(id)sender;
- (IBAction)checkButton2:(id)sender;
- (IBAction)checkButton3:(id)sender;
的.m
@synthesize checkboxButton;
@synthesize checkboxButton2;
@synthesize checkboxButton3;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
checked1 = NO;
checked2 = NO;
checked3 = NO;
}
- (IBAction)checkButton:(id)sender {
if (!checked1) {
[checkboxButton setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal];
checked1 = YES;
NSLog(@"button 1");
}
else if (checked1) {
[checkboxButton setImage:[UIImage imageNamed:@"unchecked.png"] forState:UIControlStateNormal];
checked1 = NO;
}
}
- (IBAction)checkButton2:(id)sender {
if (!checked2) {
[checkboxButton2 setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal];
checked2 = YES;
NSLog(@"button 2");
}
else if (checked2) {
[checkboxButton2 setImage:[UIImage imageNamed:@"unchecked.png"] forState:UIControlStateNormal];
checked2 = NO;
}
}
- (IBAction)checkButton3:(id)sender {
if (!checked3) {
[checkboxButton3 setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal];
checked3 = YES;
NSLog(@"button 3");
}
else if (checked3) {
[checkboxButton3 setImage:[UIImage imageNamed:@"unchecked.png"] forState:UIControlStateNormal];
checked3 = NO;
}
}
答案 0 :(得分:0)
您可以为所有20个按钮设置一个操作方法。在storybaord中,您可以为每个按钮添加标签。
你可以这样做:
-(IBAction)actionMethod:(id)sender{
UIButton *btn=(UIButton *)sender;
if(btn.tag==1){
[self toggleImageForButton:btn];
//execute button 1 other action
}
if(btn.tag==2){// execute button 2 action}
.....
if(btn.tag==20){// execute button 20 action}
}
-(void)toggleImageForButton:(UIButton *)btn{
if (btn.selected) {
[btn setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal];
}
else {
[btn setImage:[UIImage imageNamed:@"unchecked.png"] forState:UIControlStateNormal];
}
}
您还可以使用按钮标题代替标记进行比较。
将所有20个按钮连接到此方法。
您可以查看 IBOutletCollection ,将所有20个按钮声明为数组,然后修改IBOutletCollection属性。
@property (nonatomic, strong) IBOutletCollection(UIButton) NSArray *buttons;
稍后您可以访问按钮属性,如:
for (UIButton *btn in buttons) {
//access btn properties
}
请注意,出口集合的顺序大致与Interface Builder中建立连接的顺序大致相同。
答案 1 :(得分:0)
选择3个按钮,拍摄2个图像 - 假设一个被检查而其他图像未经检查。
现在转到故事板中的属性检查器(右上角的第二个选项),在选择按钮(其中任何一个)后立即找到“选择图像”“取消选择图像”的位置,故事板。
将选中的图像作为所选图像,并取消选中作为取消选择的图像,并将未检查的图像作为默认图像。
分别为三个按钮设置标签1,2,3。
现在有些代码。
编写单个IBAction方法并将所有三个按钮的操作连接到该方法。
-(IBAction)actionMethodButton:(id)sender{
UIButton *btn = (UIButton *)sender;
[self swapImagesOfButtons:btn];
switch(btn.tag){
case: 1{
//Button 1;
}
break;
case : 2 {
//Button 2;
}
break;
case : 3{
//Button 3;
}
break;
default :{
}
break;
}
}
写另一种方法来交换图像---
-(void)swapImagesOfButtons:(UIButton *)btn{
if(btn.selected ){
[btn setSelected : NO]; // if button is selected, you are deselecting it.
}
else {
[btn setSelected : YES];
}
}
答案 2 :(得分:0)
=>您可以使用按钮标签,使用下面的代码轻松实现检查和取消选中,如下所示:
你不应该继承UIButton类的子类。通过设计,Objective-C有利于组合而不是继承。
UIButton是UIControl的子类,它具有selected属性。您可以使用此属性来切换复选框的开/关行为,就像UISwitch一样。
你可以将一个动作附加到按钮的内部事件中,并在那里执行切换,如下所示:
[myCheckBoxButton setImage:nonCheckedImage forState:UIControlStateSelected]; [myCheckBoxButton setImage:nonCheckedImage forState:UIControlStateNormal];