Einstiegspunkt AppDelegate.swift mag nicht

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

  • Einstiegspunkt AppDelegate.swift mag nicht

    Moin,

    ich bastle aktuell an meiner ersten kleinen OS X-App mit Swift. Ich nutze Xcode 6.4 und bin relativ neu.
    Momentan habe ich 3 Klassen:

    Spoiler anzeigen

    JavaScript-Quellcode: STTweetWindow.swift

    1. import Cocoa
    2. import CoreLocation
    3. class STTweetWindow: NSWindow, NSWindowDelegate {
    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:STTweetWindowController!
    5. func applicationDidFinishLaunching(aNotification: NSNotification) {
    6. // Insert code here to initialize your application
    7. tweetWindowController = STTweetWindowController();
    8. showTweetWindow(); // Beispiel, nur mal zum ersten Test
    9. }
    10. func applicationWillTerminate(aNotification: NSNotification) {
    11. // Insert code here to tear down your application
    12. }
    13. func showTweetWindow() {
    14. NSApp.activateIgnoringOtherApps(true);
    15. tweetWindowController.showWindow(nil);
    16. }
    17. }
    Alles anzeigen

    JavaScript-Quellcode: STTweetWindowController.swift

    1. import Cocoa
    2. class STTweetWindowController: NSWindowController {
    3. var tweetWindow: STTweetWindow { return self.window as! STTweetWindow }
    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. }
    Alles anzeigen


    Ich sah hier keinen Swift-Syntaxhighlighter, daher mal JavaScript, das hebt dann noch paar Schlüsselwörter hervor. ;)
    Natürlich habe ich noch eine entsprechende STTweetWindow.xib, in der sich ein einfaches Window befindet.

    Mein Problem ist jetzt folgendes:
    Ich habe in den Einstellungen des Projekts unter General>Deployment info folgendes:

    CapturFiles_6.png

    Also kein Main Interface. Ich würde nun erwarten, dass Swift dann @NSApplicationMain entsprechend erkennt und dann die AppDelegate verwendet. Der Buildvorgang ist erfolgreich, nur kommt dann kein Window und auch der Haltepunkt hatte nicht ausgelöst im applicationDidFinishLaunching. Stattdessen fliegt mir das um die Ohren:


    Quellcode

    1. Failed to connect (view) outlet from (NSApplication) to (NSColorPickerGridView): missing setter or instance variable


    Das ist sehr komisch, nutze ja nirgends 'nen NSColorPickerGridView o. ä. Habe das gegooglet und gefunden, dass das ein Bug ist, den man lösen kann, indem man eine .nib-Datei anlegt, allerdings habe ich ja eine .xib und soweit ich weiß, wird daraus beim Kompilieren ja eine, oder?
    Wenn ich eine .xib-Datei bei Main Interface angebe, dann zeigt er das entsprechende Window darin an, jedoch führt er auch dann in der AppDelegate nichts aus.. Interessant wäre vielleicht noch mein erster Schritt, bei dem ich glaube, dass dieser der Ursprung des Problems sein könnte: Ich habe die MainMenu.xib gelöscht und dann meine eigene eben hinzugefügt. Habe ich damit vielleicht mein Projekt zerschossen? Verstehe ich vielleicht etwas falsch?

    Über entsprechende Hilfestellungen würde ich mich freuen!

    Grüße
  • Da es hier um OS X und nicht um iOS geht benötigt eine App eine MainMenu.xib, in welcher sich das Main Menu befindet. Weiterhin enthält die MainMenu.xib das App Delegate Objekt, sowie die Zuordnung als Delegate von NSApplication (über den File's Owner).

    Wenn Du die MainMenu.xib löschst, dann musst Du die App per Source Code entsprechend initialisieren. Die Frage ist halt nur warum Du dies möchtest? Mir ist also nicht ganz klar, warum Du auf eine MainMenu.xib, mit dem Main Menu und dem App Delegate Objekt, verzichten willst.
  • Danke! Da habe ich gar nicht drauf geachtet, dass da mein AppDelegate-Objekt drin ist. Jetzt macht das alles auch Sinn und ich kann dort einzig und allein mein Menu drin lassen (was ich ja auch brauche) und die Windows entsprechend über Controller im AppDelegate verwalten.
    Damit hast Du mir sehr geholfen. Jetzt aber ran an's Werk. ;)

    Grüße