Frage

Ich entwickle eine Plugin für OsiriX .

In dieser App i 3-4 nib Dateien. Auch in für Plugin gibt es Dateien (.h & .m) PluginFilter genannt, wo Methode genannt - (long) filterImage: (NSString) MenuName vorhanden, aus dem die Ausführung Plugin Start. Nun mein Problem ist, dass, ich habe den Code zurückkehren Hauptfenster zu starten in einer anderen .m-Datei ist, und ich habe diese Datei rufen Sie die Methode unter Verwendung der oben genannten.

Die App hat mehrere nib-Dateien. Ich habe einen Plugin-Namen PluginFilter genannt durch:

- (long) filterImage:(NSString*) menuName

Das Plugin sollte ein Fenster öffnen, wenn mit dieser Methode genannt. Der Code, der die Fenstersteuerung definiert ist, in einer anderen Feder. Wenn ich die filterimage Methode im Plugin aufrufen, erscheint das Fenster nie.

Hier ist meine filterImage: Methode.

#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

Aufruf der Methode erzeugt keine Warnungen oder Fehler, einfach das Fenster nicht erscheint.

War es hilfreich?

Lösung

Sie würden normalerweise nicht das Hauptfenster der Anwendung öffnen von einem Plugin. Plugins definitions meine nicht immer vorhanden sein, so dass Sie nicht kritischen Code in sie setzen sollte. Weder würden Sie mehr Plugins wollen die gleichen logischen Fenster zu öffnen.

Stattdessen sollte das Hauptfenster von der AppDelegate als normal angezeigt, aber der Inhalt des Fensters kann durch ein Plugin bearbeitet werden, wenn das Plugin zur Verfügung.

Die Hauptanwendung soll das Hauptfenster laden und konfigurieren und nur das Plugin rufen Sie den Inhalt des Fensters zu verarbeiten.

Auch so ist es technisch möglich, ein Fenster von einem Plugin zu öffnen, so entweder (1) wird das Plugin nicht geladen wird, und das Verfahren wird nicht aufgerufen werden (Insert Breakpoint / lügt, um zu bestätigen) oder (2) die Fenstersteuerung ist falsch konfiguriert, so dass es nicht das Fenster nicht öffnen. Testen Sie den Controller außerhalb des Plugin funktioniert es zu bestätigen. Noch besser wäre es, die Fensteröffnung Code außerhalb des Plugin bewegen.

Edit01:

Von Kommentar:

  

Ich habe einige Änderungen in der oben gemacht   Code wie folgt

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

, aber es zeigt, dass kein wanring   -init Methode gefunden. Warum es ist wie diese zeigen, weil -init Methode der ist   in der MainWindowController.m Datei

Nun, Sie haben zwei Probleme.

(1) Sie setzen mainWindowController ab Klasse MainWindowController definieren, aber sie initialisieren es mit Klasse GridSampleMainWindowController. Wenn MainWindowController eine Unterklasse von GridSampleMainWindowController ist, wird dies funktionieren, aber wird Warnungen erzeugen. Sie sollten es stattdessen initialisieren wie

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

oder

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

(2) Sie geben den Controller ohne jedes andere Objekt Halte es, die sie töten. Wenn ein Fenster Controller stirbt freigibt er die Fenster, die es steuert. Dies ist wahrscheinlich, warum Sie nichts zu sehen.

Sie sollten klären, welche Klasse Sie die Steuerung sein wollen und es dann eingestellt als vorbehaltene Eigentum der Plugin-Klasse, so dass Sie es ein sein Fenster halten um.

Welche init Methode ist es beschweren sich über? Ihre initPlugin tut nichts und gibt einen void wenn das das Plugin-ist-Methode tatsächliche Initialisierung dann das Plugin nie laden. Es sollte zumindest so aussehen:

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

Es sieht aus wie Sie von einem reinen C Hintergrund kommen, die für diese Umgebung ist groß, aber Sie müssen über die objektorientierten Teile der Objective-C-Sprache lernen. Sie schreiben immer noch Methoden, als ob sie alte Schule C-Funktionen waren und sind wichtig und oft mal feine Unterschiede.

Leider habe ich all diese gestern vermisst. Ich sah „Plug-in“ und konzentrierte sich auf die falsche Seite des Problems.

Edit02:

  

Nein, ich spreche nicht über meine initPlugin   Methode. Ich spreche über meine init   Verfahren, das es in   MainWindowController.m Datei

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

Dies wird eine Instanz der MainWindowController Superklasse zurück. Wenn Sie gar keine Anpassung zu tun haben Sie keine Notwendigkeit, die init-Methode außer Kraft zu setzen in Sie Unterklasse. Verwenden Sie einfach die geerbte Version so:

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

Andere Tipps

Ich erkennen dies zu spät ein wenig kommen werden, aber ich war nach einer Möglichkeit, die gleiche Sache, die Sie fordern und gefunden, es zu tun. Sie können NSBundle verwenden, um die gewünschte Spitze und zeigen Sie es auf einem instantiierten Controller zu laden. Wie:

@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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top