self.window bleibt nil

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • self.window bleibt nil

    Moin,

    ich melde mich nochmal.

    Spoiler anzeigen

    JavaScript-Quellcode: TweetWindow.swift

    1. import Cocoa
    2. import CoreLocation
    3. class TweetWindow: NSWindow {
    4. var locationManager: CLLocationManager!
    5. var geoCoder: CLGeocoder!
    6. func initialize() {
    7. self.titleVisibility = NSWindowTitleVisibility.Hidden;
    8. self.locationManager = CLLocationManager();
    9. self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
    10. self.locationManager.distanceFilter = 10;
    11. self.geoCoder = CLGeocoder();
    12. }
    13. func windowWillShow() {
    14. if !self.visible {
    15. let systemAppearanceName = (NSUserDefaults.standardUserDefaults().stringForKey("AppleInterfaceStyle") ?? "Light").lowercaseString;
    16. let systemAppearance = systemAppearanceName == "dark" ? NSAppearance(named: NSAppearanceNameVibrantDark) : NSAppearance(named: NSAppearanceNameVibrantLight);
    17. self.appearance = systemAppearance;
    18. self.locationManager.startUpdatingLocation();
    19. }
    20. }
    21. func windowWillClose() {
    22. self.locationManager.stopUpdatingLocation();
    23. }
    24. // Mehr kommt noch.
    25. }
    Alles anzeigen

    JavaScript-Quellcode: AppDelegate.swift

    1. import Cocoa
    2. @NSApplicationMain
    3. class AppDelegate: NSObject, NSApplicationDelegate {
    4. var tweetWindowController:TweetWindowController!
    5. func applicationDidFinishLaunching(aNotification: NSNotification) {
    6. // Insert code here to initialize your application
    7. tweetWindowController = TweetWindowController(windowNibName: "TweetWindow");
    8. }
    9. func applicationWillTerminate(aNotification: NSNotification) {
    10. // Insert code here to tear down your application
    11. }
    12. func showTweetWindowInternal() {
    13. NSApp.activateIgnoringOtherApps(true);
    14. tweetWindowController.showWindow(nil);
    15. }
    16. @IBAction func showTweetWindow(sender: AnyObject) {
    17. showTweetWindowInternal();
    18. }
    19. }
    Alles anzeigen

    JavaScript-Quellcode: TweetWindowController.swift

    1. import Cocoa
    2. class TweetWindowController: NSWindowController {
    3. var tweetWindow: TweetWindow { return self.window as! TweetWindow }
    4. override func windowDidLoad() {
    5. super.windowDidLoad()
    6. self.tweetWindow.initialize();
    7. // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
    8. }
    9. override func showWindow(sender: AnyObject?) {
    10. self.tweetWindow.windowWillShow()
    11. super.showWindow(sender)
    12. }
    13. }
    Alles anzeigen


    Nun habe ich noch eine entsprechende TweetWindow.xib, in der sich mein Window befindet. Für dieses habe ich entsprechend als Klasse meine Unterklasse eingetragen, also TweetWindow.

    Mein Problem ist jetzt folgendes:
    Beim Debuggen klicke ich meinen entsprechenden Button im Menü (das habe ich entsprechend zur Übersichtlichkeit oben rausgenommen), der dann mit der IBAction func showTweetWindow verbunden ist. Der Controller wird ja oben im AppDelegate initialisiert und das sollte so korrekt sein. Im Controller versucht er dann ja self.tweetWindow aufzurufen und dazu greift er oben darauf zurück. In dem Moment fliegt mir eine Exception: fatal error: unexpectedly found nil while unwrapping an Optional value. Entsprechende Debug-Ausgaben zeigten mir dann, wie vermutet, dass self.window nil ist. Ich kann mir allerdings nicht erklären, warum.

    Was mache ich falsch?

    Grüße
  • NSTrade schrieb:

    #Push
    Ich komme da einfach nicht weiter und auch sollte das so passen, da ich das mit einem Kumpel bereits geprüft hatte und der nichts finden konnte.

    Hat da jemand noch eine Ahnung?

    Grüße
    Hast Du denn auch schon den Bruder von der Schwester des Schwagers von dem Onkel des Fussballtrainers gebeten, das zu prüfen? ;)
  • Derjenige hatte mir noch ein wenig beim Einstieg geholfen und den hatte ich natürlich auch befragt. Nur darum ging es. ;)
    Hast Du denn eine Idee, was da falsch läuft? Ich wüsste, wie gesagt, nicht mehr, was los ist, da ich ja die Unterklasse angepasst habe und auch alles richtig übergebe.

    Grüße
  • Tipp:

    Nimm ein leeres Projekt und baue Dir das gewünschte Ziel nach.
    Also völlig losgelöst von Deinem bisherigen Projekt und nur auf die eine Sache konzentriet.

    Funktioniert es da, dann suche den Unterschied.
    Funktioniert es da nicht, dann machst Du dort auch grundliegend etwas falsch.

    Aber Du kannst dann das Beispielpojekt hier bereitstellen und da es auf das Problem reduziert ist wird Dir vermutlich auch jemand die Lösung/das Problem sagen können.

    Viele Grüße
  • Klar ist der nil .. du rufst showWindow ja auch mit nil auf :)

    Wenn du ein Fenster in einer Mac App aufmachen willst, geht das so :

    Quellcode

    1. var tweetWindowController:TweetWindowController!
    2. func applicationDidFinishLaunching(aNotification: NSNotification) {
    3. tweetWindowController = TweetWindowController(windowNibName: "TweetWindow")
    4. tweetWindowController.showWindow(self)
    5. }
    Es gibt zwei Dinge, die sind unendlich. Das Universum und die menschliche Dummheit. Wobei beim Universum bin ich mir nicht sicher - Albert Einstein
  • Ah okay, das hatte ich nämlich da gerade gemacht, da es da ging. ;) Also Window ist mit File's Owner über das Referencing Outlet verbunden.
    Führt allerdings immer noch zum Problem. Oder habe ich Dich grade falsch verstanden?

    Auf jeden Fall schon mal danke für die Hilfe.

    Grüße
  • OK, da war tatsächlich das Problem. Ich hatte das nur wegen einer Fehlkonfiguration im NIB nicht verbinden können, da die Unterklasse vom File's Owner nicht gestimmt hat (war nicht der Controller). Ich habe das geändert und konnte das dann verknüpfen.

    Nun geht alles. :)

    Grüße