带复选框的iOS构建窗体

带复选框的iOS构建窗体,ios,objective-c,Ios,Objective C,我正在用我的应用程序中的复选框构建一个表单,当然,XCode库实际上并没有提供复选框作为表单选项(疯狂);因此,我创建了带有类似于复选框(选中/未选中)的图像的按钮 也就是说,我的表单相当长,需要20多个复选框——如果我理解正确,每个复选框都必须单独“连接”例如有关我的屏幕上的三个复选框,请参阅下面的代码。。。我无法想象必须为20个复选框(更不用说3个)完成所有这些操作-有更好的方法吗?非常感谢您的帮助/建议 .h @interface PetRegistrationViewController

我正在用我的应用程序中的复选框构建一个表单,当然,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;

    }

}

您可以为所有20个按钮提供一种操作方法。在Storyboard中,可以为每个按钮提供标记

你可以这样做:

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

请注意,outlet集合的顺序与Interface Builder中建立连接的顺序大致相同

拍摄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;
      }
}
编写另一个方法来交换图像---


=>您可以使用按钮标签,使用下面的代码作为实现选中和未选中的方式,如下图所示,尝试一下:

您不需要对UIButton类进行子类化。通过设计,Objective-C更倾向于组合而不是继承

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

您可以将操作附加到按钮的内部事件,并在其中执行切换,如下所示:

[myCheckBoxButton设置图像:状态的非检查图像:UIControlStateSelected]; [myCheckBoxButton设置图像:状态的非检查图像:UIControlStateNormal]

  • (无效)myCheckboxToggle:(id)发件人 { myCheckboxButton.selected=!myCheckboxButton.selected;//切换所选属性,只是一个简单的BOOL }

注意到;每个按钮仍然需要自己的属性,是吗?查看IBOutletCollection@Brittany,将所有插座连接在一起。啊,很高兴知道。也就是说,选中这些框的目的是最终将每个框表示的数据发送到数据库。例如,如果框1和框2选中了3,我希望uilabel 1和2发布到我的数据库-这是否可能走这条路线?相应地编辑答案,这种方法会很好。只有当你能应用开关盒时,这就是为什么我说为每个按钮设置标签编辑答案后,我想这会很适合你的要求。我认为你应该使用UITableView。您可以存储单元格(例如@property NSArray*单元格),而无需将其出列。否则,布局+20表单字段可能会很痛苦。您可以在单元类中处理按钮点击。我希望这会有所帮助
   -(void)swapImagesOfButtons:(UIButton *)btn{

        if(btn.selected ){
             [btn setSelected : NO]; // if button is selected, you are deselecting it.
         }
         else {
             [btn setSelected : YES];
         }
     }