self.window总是零

我目前正试图用窗口控制器显示一个窗口。 这就是我所拥有的:

NSWindow子类

import Cocoa
import CoreLocation

class TweetWindow: NSWindow {

var locationManager: CLLocationManager!
var geoCoder: CLGeocoder!

@IBAction func tweetButtonPressed(sender:NSButton) {

}

func initialize() {
    self.titleVisibility = NSWindowTitleVisibility.Hidden;
    self.locationManager = CLLocationManager();
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
    self.locationManager.distanceFilter = 10;

    self.geoCoder = CLGeocoder();
}

func windowWillShow() {
    if !self.visible {
        let systemAppearanceName = (NSUserDefaults.standardUserDefaults().stringForKey("AppleInterfaceStyle") ?? "Light").lowercaseString;
        let systemAppearance = systemAppearanceName == "dark" ? NSAppearance(named: NSAppearanceNameVibrantDark) : NSAppearance(named: NSAppearanceNameVibrantLight);
        self.appearance = systemAppearance;

        self.locationManager.startUpdatingLocation();
    }
}

func windowWillClose() {
    self.locationManager.stopUpdatingLocation();
}
}

NSWindowController子类:

import Cocoa

class TweetWindowController: NSWindowController {

var tweetWindow: TweetWindow { return self.window as! TweetWindow; }

override func windowDidLoad() {
    super.windowDidLoad()
    self.tweetWindow.initialize()
    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}

override func showWindow(sender: AnyObject?) {
    self.tweetWindow.windowWillShow()
    super.showWindow(sender)
}
}

当然,我也有一个.xib文件,它包含我的窗口。 它被称为“TweetWindow.xib”。 现在,到目前为止,这应该是确定的。

在我的AppDelegate.swift中,我执行以下操作:

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

var tweetWindowController:TweetWindowController!;

func applicationDidFinishLaunching(aNotification: NSNotification) {
    // Insert code here to initialize your application
    tweetWindowController = TweetWindowController(windowNibName: "TweetWindow");
}

func applicationWillTerminate(aNotification: NSNotification) {
    // Insert code here to tear down your application
}

func showTweetWindowInternal() {
    NSApp.activateIgnoringOtherApps(true);
    tweetWindowController.showWindow(nil);
}

@IBAction func showTweetWindow(sender: AnyObject) {
    showTweetWindowInternal();
}

@IBAction func quitApp(sender: AnyObject) {
    NSApplication.sharedApplication().terminate(self);
}
}

我的问题如下:当我尝试点击与IBAction关联的按钮以显示窗口时,会在此引发异常:var tweetWindow:TweetWindow {return self.window as! TweetWindow; }

它说致命的错误:意外地发现零,而解包可选值,所以窗口是零。

为什么窗口在那里? 我是否试图访问价值太早或什么?

这里有一些照片:

窗口

文件的所有者

文件的所有者身份检查器

谢谢。


初始化NSWindowController或一个子类的实例不会加载NIB。 在访问window属性或showWindow()方法(基本上间接访问window属性)之前,NIB不会被加载。 在你的情况下,因为你重写了showWindow() ,所以知道在调用超类实现之前NIB没有被加载是很重要的。

所以,是的,你调用self.tweetWindow.windowWillShow()中的showWindow()覆盖,在调用super之前,为时尚早。 NIB在那时尚未装载,所以window没有连接任何东西。

当然,你必须确保插座实际上连接在NIB上,或者即使在NIB被加载后也不会连接。 但在加载之前尝试访问它是第一个问题。

我认为你的windowWillShow()方法是错误的,至少与实现一样。 窗口可以以各种方式显示,而不仅仅是窗口控制器的showWindow()方法。 例如,窗口和窗口控制器之外的东西可以做tweetWindowController.window.makeKeyAndOrderFront(nil) 。 如果你真的想做这样的事情,让窗口类重写各种order...()方法来查看窗口是否第一次被定购,如果是,请调用你的方法。


更新:

您的NIB中有几个配置错误。 以下是你需要做的事情来解决它们:

  • 将当前连接从File's Owner的“委托”出口切换到该窗口。 点击您发布的任一截图中的“x”按钮。
  • 更改文件所有者的类。 它目前是TweetWindow 。 它应该是TweetWindowController 。 控制器是加载和拥有NIB的东西,所以File's Owner的类应该是控制器类。
  • 将File's Owner的“窗口”插座连接到窗口。
  • 将窗口的“委托”插座连接到文件所有者。
  • 链接地址: http://www.djcxy.com/p/87343.html

    上一篇: self.window is always nil

    下一篇: How to get a phone's number in React Native?