2016-03-10 3 views
0

Я создаю форму с флажками в своем приложении, и, конечно, библиотека XCode на самом деле не предоставляет флажки в качестве опции формы (сумасшедшая); поэтому я создал кнопки с изображениями, напоминающими флажки (checked/unchecked).iOS Building Form with Checkboxes

Сказанное: моя форма довольно длинная и требует 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

Я думаю, вы должны использовать UITableView. вы можете хранить ячейки (например, @property NSArray *), и вам не нужно их деактивировать. в противном случае выкладывание поля формы +20 может быть болезненным. вы можете обрабатывать нажатия кнопок в классе ячейки. я надеюсь, что может помочь –

ответ

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]; 
     } 
    } 
+0

Ах, хорошо знать. Тем не менее, цель проверки ящиков заключается в том, чтобы в конечном итоге отправить данные, представленные каждым в базу данных. Например. если ящики 1 и 2 проверены на 3, я хочу, чтобы uilabel 1 и 2 отправили в мою базу данных - возможно ли, что этот маршрут будет идти? – Brittany

+0

редактирование ответа, соответственно, и этот метод будет неплохо. только если вы можете применить случай переключения, вот почему я сказал, чтобы установить тег для каждой кнопки –

+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.

+0

Отмечено; и каждая кнопка все еще нуждается в собственном имуществе, то да? – Brittany

+0

Посмотрите на IBOutletCollection @Brittany, чтобы все выходы были связаны друг с другом. –

0

=> Вы можете использовать кнопку пятам, что использование кода ниже э.а.у. способом для достижения проверяемых и непроверяемых, как показано ниже попробовать:

не требуется подкласс класса UIButton. По дизайну Objective-C выступает за композицию над наследованием.

UIButton - это подкласс UIControl, который имеет выбранное свойство. Вы можете использовать это свойство, чтобы переключить действие включения/выключения флажка, точно так же, как это делает UISwitch.

Вы можете прикрепить к ней действие кнопки он подправил внутри события, а также выполнять переключая там, что-то вроде этого:

[myCheckBoxButton setImage: nonCheckedImage Форстате: UIControlStateSelected]; [myCheckBoxButton setImage: nonCheckedImage forState: UIControlStateNormal];

  • (аннулируются) myCheckboxToggle: (ID) отправитель { myCheckboxButton.selected = myCheckboxButton.selected;! // переключить выбранное свойство, просто просто BOOL }