Domanda

sto sviluppando un plug-in per OsiriX .

In che app ho 3-4 file pennino. in per il plugin ci sono anche i file (.h & .m) chiamato PlugInFilter dove metodo chiamato - (lungo) filterImage: (NSString) nomemenu è presente da cui l'esecuzione inizio plugin. Ora il mio problema è che, devo restituire il codice per avviare la finestra principale è in qualche altro file .m e devo chiamare quel file utilizzando il metodo di cui sopra.

L'applicazione ha più file pennino. Ho un nome del plugin PlugInFilter chiamato da:

- (long) filterImage:(NSString*) menuName

Il plugin dovrebbe aprire una finestra quando viene chiamato con questo metodo. Il codice che definisce il controllore finestra è in un altro pennino. Quando chiamo il metodo filterimage nel plugin, non viene visualizzata la finestra.

Ecco il mio metodo 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

La chiamata al metodo non produce avvisi o errori, la finestra non riesce semplicemente a comparire.

È stato utile?

Soluzione

Si dovrebbe di norma non aprire la finestra principale dell'applicazione da un plugin. Plugin per definizione non è il mio essere sempre presente, quindi non si dovrebbe mettere il codice critica in loro. Né si vorrebbe più plugin di apertura della stessa finestra logica.

Al contrario, la finestra principale dovrebbe essere visualizzato dal delegato app come normale, ma il contenuti della finestra può essere elaborato da un plugin se il plugin è disponibile.

L'applicazione principale dovrebbe caricare e configurare la finestra principale e solo chiamare il plugin per elaborare il contenuto della finestra.

Anche così è tecnicamente possibile aprire una finestra da un plugin quindi o (1) il plugin non viene caricato e il metodo non viene chiamato (inserto breakpoint / log per confermare) o (2) il controllore finestra è configurato male in modo che non si apre la finestra. Verificare il controller di fuori del plugin per confermare che funziona. Meglio ancora, spostare il codice di apertura della finestra al di fuori del plugin.

Edit01:

Da commento:

  

Ho fatto alcuni cambiamenti nel sopra   codice come segue

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

, ma sta mostrando wanring che nessun   Metodo -init trovato. Perché sta mostrando in questo modo perché il metodo è -init der   nel file MainWindowController.m

Bene, ci sono due problemi qui.

(1) È possibile impostare definire mainWindowController come di classe MainWindowController ma si inizializza con classe GridSampleMainWindowController. Se MainWindowController è una sottoclasse di GridSampleMainWindowController questo funzionerà, ma genererà avvisi. Si dovrebbe invece inizializzare come

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

o

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

(2) si rilascia il controller senza qualsiasi altro oggetto conservandolo che ucciderlo. Quando un controller finestra muore rilascia le finestre da essa controllate. Questo è più probabile che questo che si vede nulla.

Si dovrebbe risolvere quale classe si desidera che il controllore di essere e quindi impostare come una proprietà conservato della classe plug-in in modo da poter mantenere una propria finestra intorno.

Quale metodo init è vero lamenta? Il tuo initPlugin non fa nulla e restituisce un void se questo è vero e proprio metodo di inizializzazione del plugin allora il plugin non caricare mai. Dovrebbe almeno simile a questa:

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

Sembra che tu provenga da un ambiente puro C, che è grande per questo ambiente, ma è necessario conoscere le parti object oriented del linguaggio Objective-C. Stai ancora scrivendo metodi come se fossero funzioni vecchia scuola C e vi sono importanti e spesso volte sottili differenze.

Ci dispiace ho perso tutto questo ieri. Ho visto "plug-in" e concentrato sull'aspetto sbagliata del problema.

Edit02:

  

No, non sto parlando di mio initPlugin   metodo. Sto parlando di mia init   metodo che c'è in   file di MainWindowController.m

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

Ciò restituirà un'istanza della classe Super del MainWindowController. Se non stai facendo qualsiasi personalizzazione non avete bisogno di eseguire l'override del metodo init in voi sottoclasse. Basta usare la versione ereditata nel seguente modo:

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

Altri suggerimenti

riconosco questo può venire un po 'troppo tardi, ma ero alla ricerca di un modo per fare la stessa cosa si sta chiedendo e trovato. È possibile utilizzare NSBundle per caricare il pennino desiderato e puntare ad un controllore esemplificato. Come:

@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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top