2012-06-24 22 views
5

Tengo 3 botones en la parte inferior de mi controlador de vista, btn1 btn2 btn3, los estoy usando en lugar de la barra de pestañas, ya que no es posible personalizar completamente una barra de pestañas según mis requisitos.manteniendo presionado un botón U (estado seleccionado/resaltado), hasta que se presione otro botón?

Ahora el problema es que cuando se presiona btn1, quiero que cambie su imagen, a un rectángulo gris, en lugar de la imagen de estado normal. He establecido las imágenes para ambos estados en la salida que he declarado para el botón, btn1Outlet, usando las propiedades setimage y uicontrolstate de la toma de corriente.

El problema es que no puedo mantener el botón seleccionado hasta que se presiona btn2 o btn3. Pero uno solo cambia a la imagen de estado seleccionada mientras está presionado, en el momento que lo dejo, vuelve a su estado normal.

¿Cómo puedo mantener la imagen de btn1 como imagen seleccionada hasta que se presione cualquiera de los otros 2 botones?

Respuesta

4

Lo que hizo es configurar una imagen para el estado "destacado" , esta es la razón por la que cuando lo presionas puedes ver tu imagen.

Lo que se quiere hacer es

1) establecer la imagen para el estado seleccionado

2) crear una propiedad para su controlador de vista (justo CONTROLL arrastrar el botón a la cabecera) utilizando la vista del asistente (mientras que en guión, segundo cuadrado en la parte superior derecha)

3) en su método para el botón del tipo de acción:

button.selected = !button.selected; 

(obviamente, rep Botón de encaje a lo que llamó su propiedad a)

+0

Gracias, esto funciona pero eso resuelve una parte de mi problema, es decir, el botón cambia la imagen y se mantiene cambiado, pero vuelve a la imagen de estado normal solo cuando se hace clic en el botón otra vez, no cuando se hace clic en cualquier otro botón. – OccamsRazor

+2

bien por supuesto , estos botones no están relacionados entre sí usted tiene que hacer la lógica usted mismo. Algo así como en la acción para el botón 2 agregar el botón1.selected = NO; button3.selected = NO; – Pochi

+0

Oh k, gracias, me preguntaba si eso es la forma correcta de hacerlo. Lo hice ahora. Gracias. Según su conocimiento, existe la posibilidad de que surja un problema con la aprobación de las aplicaciones si utilizo este tipo de método en su lugar. f la barra de pestañas? – OccamsRazor

1

Para mantener el botón seleccionado, debe llamar a setSelected: YES en el método que su botón llama. Por ejemplo:

- (void) methodThatYourButtonCalls: (id) sender { 
     [self performSelector:@selector(flipButton:) withObject:sender afterDelay:0.0]; 


} 

- (void) flipButton:(UIButton*) button { 
    if(button.selected) 
     [button setSelected:NO]; 
    else 
     [button setSelected:YES]; 

} 

Sé que parece un poco raro performSelector vocación: en lugar de simplemente llamando [remitente setSelected: SÍ], pero este último no funciona para mí, mientras que el primero lo hace!

Para que los botones se deseleccionen cuando se presiona uno diferente, sugiero agregar una variable de instancia que contenga un puntero al botón actualmente seleccionado, de modo que cuando toque uno nuevo puede llamar a flipButton: para anular la selección viejo en consecuencia. Así que ahora su código debe decir:

añadir un puntero a la interfaz de

@interface YourViewController : UIViewController 
{ 
    UIButton *currentlySelectedButton; 
} 

y estos métodos a su aplicación

- (void) methodThatYourButtonCalls: (id) sender { 
    UIButton *touchedButton = (UIButton*) sender; 

    //select the touched button 
    [self performSelector:@selector(flipButton:) withObject:sender afterDelay:0.0]; 

    if(currentlySelectedButton != nil) { //check to see if a button is selected... 
     [self flipButton:currentlySelectedButton]; 

    currentlySelectedButton = touchedButton; 
} 

- (void) flipButton:(UIButton*) button { 
    if(button.selected) 
     [button setSelected:NO]; 
    else 
     [button setSelected:YES]; 

} 
+0

Gracias por la ayuda, pero la aplicación falla el momento en que presiono el botón, con una excepción de error no detectado, selector no reconocido enviado a la instancia. – OccamsRazor

+0

Asegúrese de que cuando establece el destino para el botón que llama el selector "methodThatYourButtonCalls:" y NO "methodThatYourButtonCalls" (observe que debe tener el punto y coma si planea usar el argumento del remitente: (id) – Kpmurphy91

2

Aquí es lo que hice:

  1. Enlace los 3 botones para el siguiente método de acción
  2. Crear conjunto de los 3 botones
  3. Ajuste el botón que invoca el método seleccionado a Set
  4. los otros 2 botones para no seleccionados

    - (IBAction)buttonPressed:(id)sender 
    { 
        NSArray* buttons = [NSArray arrayWithObjects:btn1, btn2, btn3, nil]; 
        for (UIButton* button in buttons) { 
         if (button == sender) { 
          button.selected = YES; 
         } 
         else { 
          button.selected = NO; 
         } 
        } 
    } 
    

Espero que esto ayude.

¡Salud!

Cuestiones relacionadas