2009-07-03 17 views
12

Tengo una barra de herramientas con varios botones de imagen, creada en el Creador de interfaces.Cómo reemplazar programáticamente los elementos de UIToolBar integrados en IB

Me gustaría poder reemplazar programáticamente uno de los botones con un indicador de actividad cuando se lo presiona, y luego volver a colocar el botón original pero cambiar su color de blanco a amarillo cuando la actividad finaliza.

¿Es esto posible con una barra de herramientas integrada de IB o debo considerar la creación de la barra de herramientas completa mediante programación y vistas personalizadas?

Respuesta

26

Aquí es un ejemplo de lo que hice en una situación similar. Quería construir la barra de herramientas usando Interface Builder pero alternar uno de los BarButtonItems en función de si estaba "marcado" o no. En este ejemplo, hay algunas cosas clave a tener en cuenta. Los siguientes 2 variables miembro se definen para la clase en el archivo de cabecera:

NSMutableArray *toolbarItems; 
IBOutlet UIToolbar *toolbar; 
NSUInteger checkUncheckIndex; 

Cuando quiero actualizar el estado marcada, que llamo esta función ... Tenga en cuenta que hay un selector definido denominado checkUncheckClicked que es se llama cuando se hace clic en el botón particular en la barra de audio de UIToolbar. Y la UIToolbar está configurada como IBOutlet en la barra de herramientas.Alternativamente, podría conectar el UIBarButtonItem como un punto de venta y usarlo como su lógica para identificar el índice del botón, o para el caso, podría codificar el índice del botón si las cosas no cambiarán con el tiempo. Finalmente, hay un checked.png y unchecked.png para alternar entre eso incluido en el proyecto.

- (void)updateBarButtonItemChecked:(BOOL)checked { 
    if (toolbarItems == nil) { 
     toolbarItems = [[NSMutableArray arrayWithArray:toolbar.items] retain]; 
     checkUncheckIndex = -1; 

     for (NSUInteger i = 0; i < [toolbarItems count]; i++) { 
      UIBarButtonItem *barButtonItem = [toolbarItems objectAtIndex:i]; 
      if (barButtonItem.action == @selector(checkUncheckClicked)) { 
       favoriteIndex = i; 
       break; 
      } 
     } 
    } 

    if (checkUncheckIndex != -1) { 
     UIBarButtonItem *barButtonItem = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:checked ? @"checked.png" : @"unchecked.png"] 
                      style:UIBarButtonItemStylePlain target:self action:@selector(checkUncheckClicked)] autorelease]; 
     [toolbarItems replaceObjectAtIndex:checkUncheckIndex withObject:barButtonItem]; 

     toolbar.items = toolbarItems; 
    } 
} 

Y, por supuesto, toolbarItems y barra de herramientas deben publicarse en su dealloc para la clase.

Espero que esto ayude!

1

Creo que debería ser posible. Puede intentar crear un IBOutlet para ese botón específico en su clase ViewController, y conectar el botón de IB a ese punto de venta, o puede usar los elementos propiedad de esa instancia de UIToolbar (usted tiene una referencia a eso, ¿no? ?) y encuentre el elemento apropiado allí, cree un nuevo NSArray con elementos modificados y vuelva a establecerlo en la propiedad toolbar.items.

HTH

+0

muy útil, gracias. Voy a probar esto y dejarte saber cómo va. – frankodwyer

2

Aquí es el enfoque Solía ​​ Parecía ser mucho más simple de manejar la barra de herramientas en su totalidad mediante programación así que ....

En el controlador de vista Declarar 1 o más conjuntos de elementos como UIBarButtonItem los elementos de propiedad también declaran y conectan la barra de herramientas como una propiedad UIToolbar. También declare 1 o más matrices para contener los elementos.

En la implementación En viewDidLoad alloc y establecer su UIBarButtonItems por ejemplo

botones
 playButton = [[UIBarButtonItem alloc] 
     initWithBarButtonSystemItem:UIBarButtonSystemItemPlay 
    target:self 
action:@selector(handlePlayClick)]; 

flexibles (para la alineación, etc.) se declaran como esto

flexButton1 =[[UIBarButtonItem alloc] 
initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
target:nil action:nil]; 

Hay varias initMethods para manejar los diferentes tipos de botones barras de herramientas de soporte. Todos siguen una sintaxis similar a la anterior. Digno de señalar es el objetivo y la configuración de acción. Objetivo: normalmente sería uno mismo, acción es el nombre de la función que el botón debe disparar.

Después de asignar sus UIBarButtons agréguelos a una matriz usando initWithObjects.

continuación para asignar los botones de la barra de herramientas que llamarían

[toolbar setItems:<array name>]; 

No se olvide de sus dealloc UIBarButtons y matrices al final de su código.

Espero que esto ayude. Si necesitas más código, házmelo saber.

Rich D.

0

Una nota al respecto: la barra de herramientas eliminará cualquier color de los iconos, por lo que aún no podrá volverlo amarillo. Tendrá que cambiar la forma de la imagen para indicar "on" en su lugar.

Como alternativa, tendrá que cargar sus artículos BarButton con UIButtons (utilice initWithCustomView) y establecer la imagen del botón de forma adecuada.

HTH

0

Probar:

- (void)setTitle:(NSString *)title forItem:(int)item ofToolbar:(UIToolbar *)tb { 
    NSMutableArray *newItems = [tb.items mutableCopy]; 
    UIBarButtonItem *old = [newItems objectAtIndex:1], 
    *titled = [[UIBarButtonItem alloc] initWithTitle:title style:old.style target:old.target action:old.action]; 

    [newItems replaceObjectAtIndex:1 withObject:titled]; 
    tb.items = newItems; 

    [titled release]; 
} 
+1

newItems se filtra mientras está haciendo una copia. Debe liberarlo después de "tb.items = newItems;" llamada, ya que la barra de herramientas la retendrá por sí misma. – Kalle

1

Swift

Mucho ha cambiado desde estas respuestas se han publicado. Aquí hay una solución Swift 2.0.

No importa cómo se haya creado programáticamente el UIBarButtonItem original que está reemplazando. Todo lo que necesitas es la salida UIToolbar. Para reemplazar, por ejemplo, el segundo artículo de la izquierda, haga esto:

var toolbarItems = self.toolbar.items 
let newItem = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "play") 
toolbarItems![1] = newItem 
self.toolbar.setItems(toolbarItems, animated: true) 
2

Swift tiene una manera mucho más fácil. En mi caso, estoy cambiando el botón de reproducción con el botón de pausa cada vez que lo toco.

@IBAction func playandPause(sender: UIBarButtonItem) { // Here we are creating an outlet. Hook this up to the bar button item. 
    for (index, button) in toolbarItems!.enumerate() { // Enumerating through all the buttons 
     if button === sender { // === operator is used to check if the two objects are the exact same instance in memory. 
      var barButtonItem: UIBarButtonItem! 
      if mediaplayer.playing { 
       mediaplayer.pause() 
       barButtonItem = UIBarButtonItem.init(barButtonSystemItem: .Play, target: self, action: #selector(playandPause(_:))) 
      }else { 
       mediaplayer.play() 
       barButtonItem = UIBarButtonItem.init(barButtonSystemItem: .Pause, target: self, action: #selector(playandPause(_:))) 
      } 
      toolbarItems![index] = barButtonItem // Replace the old item with the new item. 
      break // Break once we have found the button as it is unnecessary to complete the rest of the loop 
     } 
    } 
} 
+0

¡Buena solución! Aunque falta el paso self.toolbar.setItems (toolbarItems, animated: true) y sin él me temo que no funcionará. –

0

Para toda la barra de herramientas que creó en el IB (es decir, no a los elementos de la barra individuales), crear una IBOutlet:

@IBOutlet weak var toolbarThatYouMade: UIToolbar! 

Este es un conjunto de elementos de la barra individuales, por lo usted podrá acceder el miembro más a la izquierda (por ejemplo) con un índice de [0]:

toolbarThatYouMade.items![0].image = UIImage(named: "New Image") 

Este código se supone que tiene una imagen llamada "Nueva imagen" en sus activos.

Puede disparar un cambio de imagen para una barra de herramientas sin tener que acceder a ese elemento específico; por ejemplo, si estuviera usando esto para algo así como un reproductor de medios, se puede alternar imágenes pausa/reproducción de:
a) el botón de pausa/reproducir en sí,
b) el botón de parada,
c) cuando se está notificado de un cambio de estado del jugador,
o
d) algo completamente distinto. (Sé valiente! Sé valiente! Sé algo más que comienza con 'b'!)

+0

Gracias por el formato @ phiter-fernandes. (Espero haberlo hecho correctamente) – clyrinkpress

Cuestiones relacionadas