2010-02-09 9 views
11

Estoy tratando de hacer una casilla de verificación estándar para mi aplicación de iPhone a partir de UIButton con un título y una imagen. La imagen del botón cambia entre una imagen "no seleccionada" y una imagen "marcada".¿Cuál es la mejor manera de hacer una casilla de verificación UIButton?

Al principio probé la subclasificación UIButton pero UIButton no tiene el método -init*** para usar en mi método -init.

¿Cuál es la mejor manera de hacerlo?

Gracias de antemano.

Respuesta

38

No debería necesitar subclasificar la clase UIButton. Por diseño, Objective-C favorece la composición sobre la herencia.

UIButton es una subclase de UIControl, que tiene una propiedad selected. Puede usar esta propiedad para alternar el comportamiento on/off de una casilla de verificación, de la misma manera que lo hace un UISwitch.

Puede adjuntar una acción al botón de retocado de eventos en el interior, y llevar a cabo la conmutación de allí, algo como esto:

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

También puede hacer esto de forma bastante hackish con una línea. 'myCheckboxButton.selected =! myCheckboxButton.selected' – Diziet

+4

puede evitar el if-else configurando una imagen para el estado del botón UIControlStateSelected;) – Climbatize

0

¿Ha intentado anular el método initWithCoder, en caso de que se cargue desde una punta de alguna manera?

+2

Realmente no es una respuesta. –

7

Ajuste las imágenes en el botón:

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

Ahora todo lo que necesita hacer es:

button.selected = state 

y se mostrarán las imágenes correctas.

+0

Respuesta útil ... – Biranchi

4

Todo lo que necesita hacer es establecer 2 imágenes diferentes para los estados UIControlStateNormal y UIControlStateSelected, luego en su selector, cambió la propiedad selected del botón.

Aquí es un ejemplo de trabajo (sustituir los nombres de imagen con su propia):

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

Para cualquier persona interesada en el futuro - en lugar de hacerlo usted mismo sólo tiene que descargar el siguiente enlace de GitHub y que tiene su subclase de UIControl ya funciona perfectamente como una casilla de verificación. También incluye un proyecto de ejemplo de lo fácil que es usar:

https://github.com/Brayden/UICheckbox

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 

} 

la imagen se puede utilizar Google icono

0

Prueba esto: -

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

    } 
} 
+0

¿Qué es lo que no quiere probar? – chouaib

+0

¿cuál es su medio? no estoy entendiendo ? – King

+0

Quiero decir que uno no siempre quiere probar algo sin explicaciones – chouaib

0

por qué no usar un interruptor - UISwitch? Esto se usa para mostrar un elemento que muestra el estado booleano de un valor.

Cuestiones relacionadas