2010-12-14 7 views
0

OK, was mache ich falsch?
1. Erstellt Kakao App und AppDelegate genannt: window2AppDelegate
2. window2AppDelegate.hNew NSWindow von der Anwendung - Mission unmöglich?

#import "PrefWindowController.h" 
@interface window2AppDelegate : NSObject <NSApplicationDelegate> { 
    NSWindow *window; 
    PrefWindowController * ctrl; 
} 

@property (assign) IBOutlet NSWindow *window; 
- (IBAction) buttonClick:(id)sender; 
- (IBAction) buttonCloseClick:(id)sender; 
@end 


3. in xib Editor, ein Fenster zum anderen Controller angeschlossen - auf AppDelegate, Button Aktionen Tasten
4 , erstellt

#import <Cocoa/Cocoa.h> 
@interface PrefWindowController : NSWindowController { 
@private 

} 
@end 

#import "PrefWindowController.h" 
@implementation PrefWindowController 

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

- (void)dealloc { 
    // Clean-up code here. 
    [super dealloc]; 
} 

- (void)windowDidLoad { 
    [super windowDidLoad]; 
    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. 
} 

@end 


5. neue xib Datei erstellt PrefWindow Fenster IBOutlet mit Fenster von seinem Controller (auch PrefW gesetzt Controller genannt indowController) Option "Sichtbar beim Start" UNCHECKED! Ich möchte dieses Fenster auf einen Button klicken.
6. implementiert window2AppDelegate

#import "window2AppDelegate.h" 
@implementation window2AppDelegate 
@synthesize window; 

- (id) init { 
    if ((self = [super init])) { 
     ctrl = [[PrefWindowController alloc] init]; 
    if ([ctrl window] == nil) 
     NSLog(@"Seems the window is nil!\n"); 
    } 
    return self; 
} 

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender { 
    return YES; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    // Insert code here to initialize your application 
} 

- (IBAction) buttonClick:(id)sender { 
// [[ctrl window] makeKeyAndOrderFront:self]; this doesn't work too :(
NSLog(@"it is here"); 
[ctrl showWindow:sender]; 
} 

- (IBAction) buttonCloseClick:(id)sender { 
    [window close]; 
} 

@end 


7. Nachdem ich Erstellen und Ausführen App: Schließen-Knopf die App schließt aber Button - zeigt mir nicht PrefWindow !? Warum und was mache ich falsch? Nicht dell mich, dass andere Fenster in Kakao Ziel-c zu zeigen, ist schwieriger als in "dumm" Java oder C#?

+0

Haben Sie überprüft, ob 'ctrl' nicht-' nil' ist, wenn Sie '-buttonClick:' aufrufen? –

+0

ja, wie in init, aber mit dem gleichen Ergebnis - es ist null – uniquepito

Antwort

0

Ich würde vorschlagen, dass Sie die Erstellung des PrefWindowController zu applicationDidFinishLaunching bewegen:

Ich bin nicht sicher, der Init-Methode der Anwendung Delegat aufgerufen wird. Wahrscheinlich wird nur initWithCoder: beim Aufheben der Archivierung des Objekts von der NIB aufgerufen.

+0

Wenn der Delegat ein benutzerdefiniertes Objekt in der NIB ist, sollte seine Init aufgerufen werden, aber es ist immer noch besser, die PrefWindowController in applicationDidFinishLaunching: – ughoavgfhw

0
- (id) init { 
    if ((self = [super init])) { 
     ctrl = [[PrefWindowController alloc] init]; 
    if ([ctrl window] == nil) 
     NSLog(@"Seems the window is nil!\n"); 
    } 
    return self; 
} 

init Art und Weise ist noch zu früh in der Ordnung der Dinge zu versuchen, IBOutlets zu testen. Sie werden immer noch nil sein. Erst später in der Objekterstellung werden die Nasenausgänge "angeschlossen". Die Standardmethode, wo Sie wissen, dass alles in der Nib-Datei angeschlossen wurde, ist:

- (void)awakeFromNib { 

} 

An diesem Punkt alle Ihre IBOutlets gültig sein sollte (sofern sie nicht absichtlich ein Objekt in einem separaten Referenzierung , noch nicht entladene Feder).

Wenn PrefWindowController eine Klasse, die nur nach verwendet werden, die Benutzereinstellungen aus dem App-Menü wählt, würde ich mit den anderen zu widersprechen und sagen, dass ich die Instanz des PrefsWindowController überhaupt nicht schaffen würde während der Anfangsladung. (Ihr Hauptcontroller sollte unabhängig vom Prefs-Fenster funktionieren). Wenn Sie über eine Methode zum Laden des Einstellungsfensters und dann verfügen, wenn diese Methode aufgerufen wird, sollten Sie überprüfen, ob die PrefsWindowController-Instanz null ist, und wenn dies der Fall ist, erstellen Sie sie und fahren mit dem Anzeigen des Einstellungsfensters fort .

+0

gut zu erstellen es scheint immer noch, dass ich etwas falsch mache ich setze if (ctrl == nil) { ctrl = [[PrefWindowController alloc] init]; if ([ctrl window] == nil) NSLog (@ "Scheint, das Fenster ist null! \ N"); } in ButtonClick-Methode, aber es schreibt immer noch in Ausgabe: "Scheint das Fenster ist Null!" und no prefs window :-(das gleiche Ergebnis mit den gleichen Zeilen in watchFromNib – uniquepito

1

Endlich habe ich das Problem gemeistert! Im Federeditor für PrefWindow musste ich folgendes tun: Setzen Sie die Besitzerklasse der Datei auf: NSWindowController dann Verbinden Sie das Fenster IBOutlet vom Eigentümer der Datei mit meinem Fenster (preferneces). Nach 6 Tagen erfolgloser Versuche arbeitet Google.
Wie auch immer, danke für alle Ihre Antworten und Zeit!

+0

Ich würde vorschlagen, dass Sie diese Einstellungen überprüfen, aber wenn Sie sagten "erstellt neue XIB-Datei mit dem Namen PrefWindow Fenster IBOutlet von seinem Controller (auch Controller Set PrefWindowController) "Ich nahm den" auch Controller auf PrefWindowController "Teil gesetzt, dass Sie die Besitzerklasse der Datei bereits als PrefWindowController festgelegt haben. – NSGod