AVISO: Cualquier pregunta que no cumpla ninguno de estos criterios podrá ser borrada sin previo aviso.

Tengo 2 botones, el primero es para iniciar y el segundo para parar. Cuando el primer boton es presionado debe desaparecer y mostrarse en la misma posicion el segundo de parar, entonces cuando se presione el segundo, debe desaparecer y mostrarse el primero de iniciar.

Cada uno de los botones ejecuta acciones diferentes.

preguntado 04 Ene '11, 19:50

jyr's gravatar image

jyr
269435561

cerró 16 Ene '11, 07:52


En Interface Builder o en código situa los dos botones en el mismo lugar, y configura sus target y selector a lo que necesites. Establece marca la propiedad Hidden del botón que quieras oculto inicialmente. En esos selectors lo único que tienes que hacer es establecer la propiedad hidden de uno u otro botón apropiadamente.

-(IBAction)actionButtonA
{
  self.buttonB.hidden = NO;
  self.buttonA.hidden = YES;
  // ... resto del código
}

-(IBAction)actionButtonB
{
  self.buttonA.hidden = NO;
  self.buttonB.hidden = YES;
  // ... resto del código
}
enlace permanente

respondido 05 Ene '11, 00:19

YoNoSoyTu's gravatar image

YoNoSoyTu
4.7k1962

Desde el Interface Builder coloque los botones en la misma posicion y oculte el de parar, en la parte de Availibility la opcion de hidden selecciono el checkbox bind to: "mi controlador" y en Model key Path puse "starButton" pero me regresa el error "this class is not key value coding-compliant for the key startButton" ¿Qué es lo que me falta para que en mi controlador puede obtener algo como self.startButton?

(05 Ene '11, 07:19) jyr

La propiedad hidden a la que me refería no está en la pestaña de Bindings (que creo que es a la que te refieres tú), si no en la primera pestaña (Attributes), en la parte inferior, en la sección View.

Se podría hacer con bindings. De hecho sería recomendable. Para ello define un BOOL startButtonHidden en tu controllador, y utiliza ese nombre como Model Key Path en los dos botones, y en el caso del botón alternativo, en Value Transformer pon NSNegateBoolean. De esa forma ya no tendrías que hacer el baile de hidden YES/NO en tus acciones.

(05 Ene '11, 20:05) YoNoSoyTu

Bien, pero no estoy creando los botones programaticamente, sino que los hago desde interface builder. Lo que intento es desde interface builder ponerle un nombre a mi button para que represente el objeto y ahora si lo pueda usar como self.startButton.

Lo hice como mencionas con los bindings y se oculta el boton de stopButton al iniciar la aplicacion, pero me falta hacer que cuando presionen el de start se oculte ese mismo y se muestre el de stop, tambien se debe hacer de forma contraria, al precionar stop se oculta ese boton y mostrar el de start.

Pero no encuentro como nombrar/crear el objecto de mis botones desde interface builder.

(06 Ene '11, 05:11) jyr

Estoy usando pyobjc y no objective-c, cuando me dan una respuesta la traduzco a pyobjc y ahora lo he solucionado creando 2 outlets en mi controlador

class MEMPController (NSWindowController):
    startButton = objc.IBOutlet()
    stopButton = objc.IBOutlet()

@objc.IBAction
    def startServers_(self, sender):
    self.startButton.setHidden_(YES)
    self.stopButton.setHidden_(NO)
    print "start servers..."

@objc.IBAction
    def stopServers_(self, sender):
    self.startButton.setHidden_(NO)
    self.stopButton.setHidden_(YES)

El codigo completo en https://gist.github.com/767645

(06 Ene '11, 08:30) jyr

Lo siento, me salté un par de pasos que daba por obvios.

Por ahora lo has hecho bien, necesitas dos IBOutlets en tu controlador, y debes conectarlos en Interface Builder. Para ello, en IB, en la ventana del documento, busca el File’s Owner, que debería ser de la clase MEMPController (si no lo es, deberías establecerla en pestaña Identity del inspector). Si haces click derecho sobre el File’s Owner te aparecerá la lista de outlets y actions (al menos te aparecen usando Objective-C). Si no te aparecen, el proceso se ha movido en cada versión de IB, pero ahora parece que es así: en la ventana Library, en la pestaña Classes busca tu MEMPController y seleccionalo. En la parte de abajo selecciona Outlets y añade allí el outlet con la clase que necesites (en tu caso los dos botones, y si quieres utilizar bindings para ocultarlos, el BOOL de la anterior respuesta).

Con todo conectado, los setHidden_ debería ocultar o desocultar los botones correctamente, o si utilizas startButtonHidden y estableces su valor en startServers y stopServers a YES y NO (algo que faltaba en mi respuesta anterior) deberían mostrarse/ocultarse automágicamente.

(06 Ene '11, 10:18) YoNoSoyTu

Lo tienes como propiedad en el archivo.h ?

enlace permanente

respondido 05 Ene '11, 08:19

KoldoMac's gravatar image

KoldoMac
272121624

No, tengo todo el GUI definido desde el interface builder

(06 Ene '11, 05:09) jyr
Tu respuesta:
Activar/desactivar vista previa

Sobre esta pregunta

Etiquetas de la pregunta:

×110
×38

Pregunta realizada el: 04 Ene '11, 19:50

Pregunta visitada: 1,010 veces

Última modificación: 16 Ene '11, 12:43

Seguir esta pregunta

Por Email:

Una vez que entres podrás suscribirte desde aquí para recibir actualizaciones

Por RSS:

Respuestas

Respuestas y Comentarios

Realizar Donación