Question

Je développe un plugin pour OsiriX .

Dans cette application j'ai 3-4 fichiers nib. De plus en plug-in pour il y a des fichiers (.h & .m) appelé PluginFilter où méthode appelée - (longue) filterImage: (NSString) MENUNAME est présent à partir de laquelle l'exécution de démarrage de plug-in. Maintenant, mon problème est que, je retourner le code pour lancer la fenêtre principale est dans un autre fichier .m et je dois appeler ce fichier en utilisant la méthode mentionnée ci-dessus.

L'application a plusieurs fichiers nib. J'ai un nom de plug-in PluginFilter appelé par:

- (long) filterImage:(NSString*) menuName

Le greffon doit ouvrir une fenêtre lorsqu'elle est appelée par cette méthode. Le code qui définit le contrôleur de fenêtre est dans une autre plume. Quand j'appelle la méthode filterimage dans le plug-in, la fenêtre n'apparaît jamais.

Voici ma méthode de 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

L'appel de la méthode ne produit pas des avertissements ou des erreurs, la fenêtre ne parvient pas simplement apparaître.

Était-ce utile?

La solution

Normalement, vous devez ouvrir la fenêtre principale de l'application d'un plug-in. Plugins, par définition, mon pas toujours être présents afin que vous ne devriez pas mettre le code critique en eux. Ni voudriez-vous plusieurs plugins d'ouverture de la même fenêtre logique.

Au lieu de cela, la fenêtre principale doit être affichée par le délégué de l'application comme d'habitude, mais le contenu de la fenêtre peut être traitée par un plug-in si le plugin est disponible.

La principale application doit charger et configurer la fenêtre principale et seulement appeler le plugin pour traiter le contenu de la fenêtre.

Même si cela est techniquement possible d'ouvrir une fenêtre d'un plug-in si soit (1) le module ne soit pas chargé et que le procédé ne soit pas appelé (insert breakpoint / log pour confirmer) ou (2) le dispositif de commande de fenêtre est mal configuré de manière à ne pas ouvrir la fenêtre. Testez le contrôleur en dehors du plug-in pour confirmer cela fonctionne. Mieux encore, déplacez le code d'ouverture de la fenêtre en dehors du plug-in.

Edit01:

De commentaire:

  

Je l'ai fait quelques changements dans ce qui précède   code comme suit

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

mais il montre wanring qu'aucun   méthode -init trouvé. Pourquoi il montre comme celui-ci parce que la méthode est -init der   dans le fichier MainWindowController.m

Eh bien, vous avez deux problèmes ici.

(1) Vous définissez définir mainWindowController comme de MainWindowController de classe, mais vous initialisez avec classe GridSampleMainWindowController. Si MainWindowController est une sous-classe de GridSampleMainWindowController cela fonctionnera, mais générera des avertissements. Vous devriez plutôt l'initialiser comme

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

ou

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

(2) Vous libérez le contrôleur sans autre objet retenir qui le tuera. Lorsqu'un contrôleur de fenêtre meurt, il libère les fenêtres qu'il contrôle. Ceci est probablement la raison pour laquelle vous ne voyez rien.

Vous devez trier quelle classe vous voulez que le contrôleur soit et puis le définir comme une propriété conservée de la classe plug-in afin que vous puissiez garder une fenêtre autour de son.

Quelle méthode init est-il plaint? Votre initPlugin ne fait rien et renvoie un void si c'est la méthode d'initialisation réelle du plug-in alors le plug-in ne sera jamais charger. Il devrait au moins ressembler à ceci:

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

On dirait que vous venez d'un milieu pur C qui est excellent pour cet environnement, mais vous devez en apprendre davantage sur les pièces orientées objet du langage Objective-C. Vous écrivez encore des méthodes comme si elles étaient vieilles fonctions C de l'école et il y a des moments importants et souvent des différences subtiles.

Désolé j'ai manqué tout cela hier. J'ai vu « plugin » et concentré sur l'aspect mauvais du problème.

Edit02:

  

Non, je ne parle pas de mon initPlugin   méthode. Je parle de mon initialisation   procédé qui est là dans   fichier MainWindowController.m

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

Ceci renvoie une instance de super classe du MainWindowController. Si vous ne faites aucune personnalisation que vous avez pas besoin de remplacer la méthode d'initialisation en vous sous-classe. Il suffit d'utiliser la version héritée ainsi:

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

Autres conseils

Je reconnais cela peut être venir un peu trop tard, mais je cherchais un moyen de faire la même chose que vous demandez et trouvé. Vous pouvez utiliser NSBundle pour charger la pointe désirée et pointer vers un contrôleur instancié. Comme:

@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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top