Pregunta

Estoy escribiendo una aplicación Cocoa/Objective-C en Xcode4, y necesito saber cuándo se abre mi panel de preferencias. Necesito una devolución de llamada como WindowDidbecomekey; Intenté seguir la solución proporcionada en esta pregunta, pero tampoco windowDidBecomeKey o windowDidExpose aparecer como métodos delegados (pero otros, como windowDidLoad, windowWillLoad, etc. do).

Para aclarar exactamente lo que quiero decir con "No aparezcas como métodos delegados", Quiero decir que no aparecen en el auto completo cuando comienzo a escribir el nombre del método. yo hizo Intenta definirlos de todos modos, pero nunca fueron llamados.

Hacer NSPanel Los objetos carecen de estos métodos, ¿o hay algo más que tengo que hacer?

Actualmente, tengo una interfaz PrefWindowController:

PrefWindowController.h:

#import <Cocoa/Cocoa.h>

@interface PrefWindowController : NSWindowController
    //Delegate methods like windowDidBecomeKey appear to not be available here
@end

PrefWindowController.m:

@implementation PrefWindowController

- (id)initWithWindow:(NSWindow *)window
{
    self = [super initWithWindow:window];
    if (self) {
        NSAlert *alert = [[[NSAlert alloc] init] autorelease];
        [alert setMessageText:@".."];
        [alert runModal];
    }

    return self;
}

- (void)windowDidLoad
{
    NSAlert *alert = [[[NSAlert alloc] init] autorelease];
    [alert setMessageText:@"Loaded"];
    [alert runModal];
}

@end

Cuando la ventana se carga desde el .xib como se inicia la aplicación, windowDidLoad Se muestran incendios y la notificación definida anteriormente. Hice esto solo para probar que los métodos realmente se llamaban.

Cualquier consejo sobre cómo obtener una devolución de llamada para cuándo el panel se convierte en clave o se enfoca sería muy útil.

Actualizar:

Agregué un windowDidBecomeKey Método para el controlador de la ventana, como así:

Prefwindowcontroller.h:

- (void)windowDidBecomeKey:(NSNotification *)notification;

Prefwindowcontroller.m:

- (void)windowDidBecomeKey:(NSNotification *)notification
{
    NSLog(@"Test");
}

El mensaje de prueba se registra la primera vez que abre la ventana, pero en la línea de retorno en mi main.m archivo recibo el error:

Tema 1: Señal recibida del programa: "exc_bad_access"

¿Fue útil?

Solución

los Nswindowdelegado El protocolo tiene los siguientes métodos

- (void)windowDidBecomeKey:(NSNotification *)notification
- (void)windowDidResignKey:(NSNotification *)notification

Por lo tanto, puede configurar su NSWindowController como delegado de NSWindow para obtener esta devolución de llamada. También puede registrarse para estas notificaciones:

NSWindowDidResignKeyNotification
NSWindowDidBecomeKeyNotification

Nspanel es una subclase NSWindow, por lo que todo este comportamiento se aplica en su caso.

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