Pregunta

Estoy desarrollando un plugin para OsiriX .

En esa aplicación que tengo 3-4 archivos nib. También en plug-in para el que hay archivos (.h y .m) llamada PluginFilter donde método llamado - (largo) filterImage: (NSString) MenuName está presente desde el cual la ejecución de inicio del complemento. Ahora mi problema es que, tengo que volver a poner en marcha el código ventana principal está en algún otro archivo .m y tengo que llamar a ese archivo usando el método mencionado anteriormente.

La aplicación tiene múltiples archivos nib. Tengo un nombre del plugin PluginFilter llamado por:

- (long) filterImage:(NSString*) menuName

El plugin debería abrir una ventana cuando se le llama por este método. El código que define el controlador de ventana está en otra punta. Cuando llamo el método filterimage en el plugin, nunca aparece la ventana.

Este es mi método filterImage:.

#import "XGridInOsiriXFilter.h"
#import "MainWindowController.h"

@implementation XGridInOsiriXFilter

- (void) initPlugin
{

}

- (long) filterImage:(NSString*) menuName
{

    MainWindowController *mainWindowController = [[GridSampleMainWindowController alloc] init];
    [mainWindowController showWindow:self ];
    [mainWindowController release];

    return 0;
}

@end

Al llamar al método produce no advertencias o errores, la ventana simplemente no aparece.

¿Fue útil?

Solución

Que normalmente no abrir la ventana principal de la aplicación de un plugin. Plugins, por definición, no siempre mis estar presentes por lo que no debe poner código crítico en ellos. Ni le gustaría múltiples plugins de apertura de la misma ventana lógico.

En lugar de ello, la ventana principal se debe mostrar por el delegado de la aplicación de forma normal, pero el contenido de la ventana puede ser procesado por un plugin si el plugin está disponible.

La aplicación principal debe cargar y configurar la ventana principal y sólo llamar al plugin para procesar el contenido de la ventana.

A pesar de ello es técnicamente posible para abrir una ventana de un plugin así que o bien (1) no está siendo cargado el plugin y no se está llamando el método (punto de interrupción de inserción / log confirmar) o (2) el controlador de ventana es mal configurado de manera que no se abre la ventana. Probar el dispositivo fuera del plugin para confirmar que funciona. Mejor aún, mueva el código de apertura exterior de la ventana del plugin.

Edit01:

Desde comentario:

  

He hecho algunos cambios en los anteriores   código como sigue

- (long) filterImage:(NSString*) menuName { 
    MainWindowController *mainWindowController = [[GridSampleMainWindowController alloc] init:self];            
    [mainWindowController showWindow:self ]; 
    [mainWindowController release]; 
    return 0; 
}
  

pero está mostrando que ningún wanring   método -init encontrado. ¿Por qué se está mostrando como esto porque es el método init der   en el archivo MainWindowController.m

Bueno, tiene dos problemas aquí.

(1) Se establece como definir mainWindowController de MainWindowController clase, pero se inicializa con GridSampleMainWindowController clase. Si MainWindowController es una subclase de GridSampleMainWindowController esto va a funcionar, pero generará advertencias. En su lugar debe inicializarlo como

GridSampleMainWindowController *mainWindowController = [[GridSampleMainWindowController alloc] init:self];  

o

MainWindowController *mainWindowController = [[MainWindowController alloc] init:self]; 

(2) se suelta el controlador sin cualquier otra reteniéndolo objeto que matará a ella. Cuando un controlador de ventana muere desasigna las ventanas que controla. Esto es más probable por la que se ve nada.

Usted debe resolver clase en la que desea que el controlador sea y luego otra vez como una propiedad retenida de la clase de complemento para que pueda mantener una ventana de su alrededor.

¿Qué método se init se quejaba? Su initPlugin no hace nada y devuelve un void si eso es real método de inicialización del plugin entonces el plugin no se carga. Por lo menos debería tener este aspecto:

- (id) initPlugin
{
    self=[super init];
    return self;
}

Parece que viene de un fondo C pura que es ideal para este entorno, pero que necesita para aprender acerca de las partes orientadas a objetos del lenguaje Objective-C. Todavía estás escribiendo métodos como si fueran funciones de la escuela vieja C y hay momentos importantes ya menudo sutiles diferencias.

Lo sentimos echaba de menos todo esto ayer. Vi "plug-in" y se centró en el aspecto equivocado del problema.

Edit02:

  

No, no estoy hablando de mi initPlugin   método. Estoy hablando de mi init   método que es allí en   MainWindowController.m archivo

- (id)init { 
      self = [super initWithWindowNibName:@"MainWindow"]; 
      return self; 
}

Esto devolverá una instancia de clase superior de la MainWindowController. Si usted no está haciendo cualquier personalización que no tienen necesidad de reemplazar el método init en la subclase. Sólo tiene que utilizar la versión heredada de esta manera:

MainWindowController *mainWindowController = [[MainWindowController alloc] initWithWindowNibName:@"MainWindow"]; 

Otros consejos

Reconozco que esto puede estar llegando un poco tarde, pero yo estaba buscando una manera de hacer la misma cosa que usted está pidiendo y lo encontró. Puede utilizar NSBundle para cargar la punta deseada y el punto a un controlador instanciado. Como:

@implementation YourPluginFilter

- (void) initPlugin
{
yourWindowController = [[YourWindowController alloc] init];
NSLog(@"Initialized YourWindowController");
}

- (long) filterImage:(NSString*) menuName
{
if (yourWindowController && [NSBundle loadNibNamed:@"YourNibName" owner:yourWindowController]) {
        NSLog(@"Activated yourWindowController");
    return 0;
} else {
    return -1;
}
}

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