Pregunta

Estoy teniendo algunos problemas de unión de un "valor" de NSMenuItem unión a un BOOL.

he simplificado el problema a esto:

1) El elemento de menú debe llamar al método de acción que cambia el valor de la BOOL de lo contrario no funciona (es decir, si un NSButton llama a un método que cambia el valor de la BOOL entonces el elemento de menú no se actualizará)

2) Incluso si el método de acción hace que la BOOL una constante (es decir enabled = YES), el "valor" de la opción de menú todavía suplentes.

¿Alguna idea? Estoy tan confundido!

Este es el código:

MenuBindings_AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface Menu_BindingsAppDelegate : NSObject <NSApplicationDelegate> 
{   
   BOOL foo;
}

- (IBAction)toggle:(id)sender;
- (IBAction)makeYes:(id)sender;

@property BOOL foo;

@end

Menu_BindingsAppDelegate.m

@implementation Menu_BindingsAppDelegate

@synthesize foo;

- (IBAction)toggle:(id)sender
{
   [self setFoo:!foo];
}

- (IBAction)makeYes:(id)sender
{   
   [self setFoo:YES];
}

@end

En mi semilla, que tienen un botón conectado a los -makeYes: acción y un elemento de menú conectado a la -toggle: acción. "Valor" de la opción de menú unión está obligado a atributo "foo" del delegado de la aplicación.

Gracias.

¿Fue útil?

Solución

Los usos del cacao Fijaciones de valor-clave Observando (MVA) para obtener la notificación de los cambios en los objetos del modelo. Para que el cambio en el modelo (su valor BOOL) para ser observado por los observadores, incluyendo los puntos de vista que utilizan fijaciones, debe actualizar el modelo utilizando valor-clave de codificación métodos de acceso que cumplen las. Si se acaba de establecer el valor de la Ivar directamente, no se enviarán notificaciones MVA.

Usted puede poner en práctica el KVC accessores de sí mismo o declarar una propiedad y el uso de la palabra clave @synthesize en su aplicación para tener el compilador crear descriptores de acceso compatibles para usted.

Así es como se llevaría a cabo descriptores de acceso KVC compatibles:

//YourModel.h
@interface YourModel : NSObject
{
    BOOL enabled;
}
- (BOOL)enabled;
- (void)setEnabled:(BOOL)flag;
@end

//YourModel.m
@implementation YourModel
- (BOOL)enabled
{
    return enabled;
}
- (void)setEnabled:(BOOL)flag
{
    enabled = flag;
}
@end

y así es como se haría lo mismo usando la sintaxis-C Objetivo 2.0 propiedad:

//YourModel.h
@interface YourModel : NSObject
{
    BOOL enabled;
}
@property BOOL enabled;
@end

//YourModel.m
@implementation YourModel
@synthesize enabled;
@end

A continuación, puede llamar a cualquier [yourModel setEnabled:YES] y observadores registrados MVA (incluyendo el menú de su unión) será informado del cambio.

Como alternativa, puede llamar yourModel.enabled = YES que utilizará los descriptores de acceso adecuados KVC si está disponible.

He subido un proyecto de ejemplo para demostrar cómo se hace.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top