2016-04-20 22 views
0

Ich möchte einen "NSPanel" anzeigen, damit der Benutzer einen Namen für einen neuen Ordner eingeben kann. Warum ein NSPanel? Weil es großartig aussieht! Es enthält ein TextField und ein PushButton, um den Namen zu bestätigen. Es soll auch das Fenster schließen, wenn darauf geklickt wird.Verwenden Sie NSPanel für Benutzereingaben. Nicht wieder öffnen

Image of my NSPanel

Es zeigt, wenn die Schaltfläche "Hinzufügen" in meinem Menü angeklickt wird. Es schließt sich auch, wenn die Schaltfläche "Fertig" in der NSPanel geklickt wird. Aber wenn ich wieder auf "Hinzufügen" klicke, wird es nicht mehr angezeigt. Das passiert auch, wenn ich es über den normalen "Schließen-Button" in der Titelleiste schließe. Es ist also nicht explizit auf den "fertig" -PushButton bezogen. Ich testete auch Implementierung func windowWillClose(notification: NSNotification), die auch in beiden Fällen nicht ausgelöst wird. Was könnte das Problem sein? Muss es auch jedes Mal ein "neues" Fenster sein? Oder verwende ich das richtig für Benutzereingaben? Ich meine, es wird nur einmal instanziiert und dann "gezeigt" und "nicht gezeigt" oder liege ich falsch?

Also habe ich eine neue Cocoa-Class - Subclass von NSWindowController - und lassen Sie xCode auch eine .xib dafür erstellen. In dieser .xib "entwarf" ich die NSPanel. Ich tickte visible at launch, ohne dass das Fenster nicht angezeigt würde, wenn die Menüschaltfläche geklickt wird. Ich habe auch eine IBOutlet für die NSPanel in meiner Cocoa-Klasse angeschlossen. Meine Klasse im Moment wie folgt aussieht:

import Cocoa 

class NamingHUD: NSWindowController, NSWindowDelegate { 
    @IBOutlet var insertNameWindow: NSPanel! 
    @IBOutlet weak var nameTextField: NSTextField! 
    override var windowNibName : String! { 
     return "NamingHUD" 
    } 
    override func windowDidLoad() { 
     super.windowDidLoad() 

     insertNameWindow.center() 
     insertNameWindow.makeKeyAndOrderFront(nil) 
     NSApp.activateIgnoringOtherApps(true) 
    } 
    @IBAction func userSetName(sender: NSButton) { 
     print("Close button clicked") 
     insertNameWindow.close() 
    } 
} 

In meiner Hauptklasse ich es als eine Variable wie folgt erklärt:

var namingHUD:NamingHUD! 

und dann in override func awakeFromNib() als:

namingHUD = NamingHUD() 

als sowie in einem Click-Handler wie:

@IBAction func addClicked(sender: NSMenuItem) { 
     namingHUD.showWindow(nil) 
    } 

Jetzt. Wenn ich klicke und addClicked() ruft, erscheint das Fenster wie erwartet. Fein! Ich gebe einen Namen ein und klicke auf "Fertig" und das Fenster wird geschlossen. Auch gut! Aber wenn ich erneut klicke, um einen anderen Ordner hinzuzufügen, wird das Fenster nicht mehr angezeigt. Ich habe auch ein Preferences Window genau so erstellt. Aber mit einem Fenster statt einem NSPanel drin. Das funktioniert völlig wie es sollte.

Also habe ich klar etwas verwirrt oder etwas vergessen. Was könnte es sein? Ich gebe offen zu, dass es das erste Mal ist, dass ich mit einem Fenster außerhalb eines Tutorials arbeite. Also habe ich das ganze Konzept nicht verstanden. Ich habe in Apples Developer Guide etwas über Windows gelesen und es ergibt einen Sinn. Aber ... nun, im Moment funktioniert es nicht. Bin ich "missbrauchen" die NSPanel? Sollte das nicht der Fall sein, da er von NSWindow erbt oder?

Antwort

0

Haben Sie die window Steckdose von NamingHUD an Ihr tolles Panel angeschlossen? Nibs sind träge geladen:

namingHUD = NamingHUD() // init the controller but doesn't load the nib 
... 
namingHUD.showWindow(nil) // now you are loading it for the first time 

Es funktioniert das erste Mal, weil showWindow() Lasten der Spitze und das Fenster durch den window Ausgang verwiesen zeigen. Ihr Panel wird angezeigt, weil es auf "Beim Start sichtbar" eingestellt ist. Du hattest natürlich kein Fenster zu zeigen.

Nachfolgende Klicks laden die Nib-Datei nicht erneut. Bestellen Sie nur die window Steckdose, die angezeigt wird. Aus diesem Grund wurde Ihr Panel nicht erneut angezeigt.FYI: ein NSPanel ist eine Unterklasse von NSWindow so hat es alles, was NSWindow hat, und dann noch etwas mehr.

+0

Vielen Dank! Das gab mir ein wenig Einblick. Es funktioniert jetzt. – user57213