self.window 始终为零

2024-02-08

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

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!推文窗口; }

It says 致命错误:在解包可选值时意外发现 nil, so window is nil.

为什么窗口为零?我是否太早尝试获取该值或其他什么?

以下是一些照片:

Thanks.


初始化一个实例NSWindowController或者子类做not加载 NIB。 NIB 不会被加载,直到window属性被访问或showWindow()方法被调用(它基本上访问window间接财产)。就你而言,因为你是压倒性的showWindow(),重要的是要知道在调用超类实现之前不会加载 NIB。

所以,是的,您致电self.tweetWindow.windowWillShow()在你的showWindow()在调用 super 之前覆盖还为时过早。此时 NIB 尚未加载,因此window插座尚未连接到任何东西。

当然,您必须确保插座确实连接在 NIB 中,否则即使在加载 NIB 后也永远不会连接。但在加载之前尝试访问它是第一个问题。

我认为你的windowWillShow()方法被误导了,至少在实施时是这样。窗口可以通过多种方式显示,而不仅仅是通过窗口控制器的showWindow()方法。例如,窗口和窗口控制器之外的东西都可以做tweetWindowController.window.makeKeyAndOrderFront(nil)。如果你真的想做这样的事情,让窗口类覆盖各种order...()方法来查看窗口是否是第一次订购,如果是,则调用您的方法。


Update:

您的 NIB 中有几处配置错误。您需要执行以下操作来修复它们:

  • 断开从文件所有者的“委托”出口到窗口的当前连接。单击您发布的任一屏幕截图中显示的“x”按钮。
  • 更改文件所有者的类别。目前是TweetWindow。它应该是TweetWindowController。控制器加载并拥有NIB,因此File's Owner 的类应该是控制器类。
  • 将文件所有者的“窗口”出口连接到窗口。
  • 将窗口的“委托”出口连接到文件所有者。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

self.window 始终为零 的相关文章

  • 来自索引范围 Swift 的新数组

    我怎样才能做这样的事情 从数组中取出前 n 个元素 newNumbers numbers 0 n 目前出现以下错误 error could not find an overload for subscript that accepts th
  • UITesting、XCTest 当前 ViewController 类

    简单的问题 我有一个按钮可以执行到下一个视图控制器的操作 我想写 UI XCTest 来告诉我它是否打开了我想要的视图控制器 UI 测试框架无法访问您的应用程序代码 这使得无法对实例进行类断言 你不能够directly告诉屏幕上的控制器的类
  • 如何使用 SwiftUI 获取多个屏幕上的键盘高度并移动按钮

    以下代码获取键盘显示时的键盘高度 并将按钮移动键盘高度 在转换源 ContentView 和转换目标 SecibdContentView 处以相同的方式执行此移动 但按钮在转换目标处不移动 如何使按钮在多个屏幕上移动相同 import Sw
  • 如何组合两个 SwiftyJSON 对象

    我有一个 swiftyJSON 对象 例如 location http img http commentCount 0 timestamp 1432460217550 我希望能够向其附加另一个 swiftyJSON 对象 使其看起来像 lo
  • 保存来自 TrueDepth 相机的深度图像

    我正在尝试保存 iPhone X TrueDepth 相机的深度图像 使用AVCam照片滤镜 https developer apple com library content samplecode AVCamPhotoFilter Lis
  • 在 UITableViewController 中重新排序行后 UI 更新不正确

    因此 我对表中的行重新排序 用户界面最终结果不正确 场景如下 表内容原文 a b c d e 如果我移动第 0 行 当前a 到第 4 行 当前e 我看到的最终结果是 c d e a a 一些背景 该表正在读取 Realm 对象的列表 我确认
  • 带约束的嵌套集合视图的意外行为 (Swift 4)

    我的表格视图中有一个单元格 其中包含水平分页集合视图 该集合视图的每个页面内都有一个垂直集合视图 为了避免 滚动滚动 问题 我在垂直集合视图中禁用了垂直滚动 垂直集合视图的单元格计数不是静态的 可以是任意数字 因此 这会产生一个问题 集合视
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的
  • 如何从 os x 终端启动屏幕保护程序(并锁定屏幕)?

    有没有办法从 bash 脚本启动屏幕保护程序 并锁定屏幕 你试过这个吗 System Library Frameworks ScreenSaver framework Resources ScreenSaverEngine app Cont
  • 如何观察UserDefaults的变化?

    我有一个 ObservedObject在我看来 struct HomeView View ObservedObject var station Station var body some View Text self station sta
  • 导入 matplotlib.pyplot 时出错

    当我跑步时import matplotlib pyplot as plt 我收到以下错误消息 ImportError Traceback most recent call last
  • 如何检测 swiftui 中是否存在键盘

    我想知道按下按钮时键盘是否存在 我该怎么做 我已经尝试过 但我没有任何运气 谢谢 使用该协议 KeyboardReadable 你可以符合任何View并从中获取键盘更新 KeyboardReadable协议 import Combine i
  • viewController 中的 Sprite 粒子系统动画

    I create a macOS single window application and add a Sprite Particle System file with template Stars and the visual effe
  • dyld:惰性符号绑定失败

    当我尝试运行时遇到一个奇怪的错误gatsby develop在新创建的 gatsby 项目中 这不应该与 gatsby js 静态站点生成器 有任何关系 因为我在不同的场合也遇到了相同的错误 当我跑步时gatsby develop在我的一个
  • 如何在不卸载应用程序的情况下删除木桶?

    我最近安装了一个带有 homebrew cask 的应用程序 但我想自己处理它的更新 而不是通过brew cask upgrade 是否有命令或选项可以从本地列表中删除木桶而不卸载它 如果我使用brew cask remove or bre
  • 可以获取位置,但无法获取航向

    我目前只使用模拟器 但我在 iOS 模拟器上快速使用 CoreLocation 时遇到问题 我得到此代码打印的位置更新 但从未得到标题 我不想当然 我正在尝试制作一个指南针类型的应用程序 它将显示目标的方位 class CompassVie
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • “pdo_mysql”已禁用,我无法启用它。我在 iMac 7.1 OSX 10.6.8 上安装了 MAMP v. 3.0.4

    pdo mysql 已禁用 我无法启用它 我在 iMac 7 1 OSX 10 6 8 上安装了 MAMP v 3 0 4 在我的 phpinfo 页面上 我可以看到唯一启用的 PDO 是 sqlite 如果我查看 php 5 5 10 扩
  • 设置/覆盖 UICollectionView 中单元格之间的填充

    我有一个 UICollectionView 但在获取单元格之间的填充时遇到了问题 理论上 我应该能够将屏幕除以 4 并且我可以获得包含 4 个图像的单元格大小 完美地占据屏幕宽度 但是 它选择不这样做 相反 它会创建 3 个具有巨大填充的图

随机推荐

  • 你可以在 Swift 字符串插值中使用字符串/字符文字吗?

    是否可以在 Swift 中的字符串插值中使用字符串 字符文字 语言参考说 在内插字符串的括号内编写的表达式不能包含未转义的双引号 这对我来说有点模糊 因为它似乎故意留下转义双引号的漏洞 如果我尝试 println Output repeat
  • 我试图编写一个包含二次公式的程序,但我不明白为什么我不断收到错误[重复]

    这个问题在这里已经有答案了 import math a float input Enter value for a b float input Enter value for b c float input Enter value for
  • 创建新的 Hibernate 表

    所以我对 Hibernate 还很陌生 而且我正在开发一个大型应用程序 该应用程序已经有一个包含多个 Hibernate 表的数据库 我正在开发一项新功能 其中包括一个新功能 Entity类 我需要将这些对象存储在一个新表中 该类声明如下
  • 如何在Jenkins中使用ANSIcolor插件?

    我已经为 Jenkins 安装了 ANSI color 插件 在作业中 我已使用默认配置文件 xterm 激活了该插件 我不知道打印到控制台日志时如何对控制台日志的输出进行着色 来自批处理文件的日志 Windows 平台 有关的文档 htt
  • 作为 OpenShift 用户,我可以做什么?

    我目前正在使用虚拟服务器并想尝试一下开放式班次 http openshift redhat com 出去 但我还没有真正了解它是如何工作的 我可以获得我的 网络空间 的 root 访问权限吗 我可以设置服务器操作系统 例如 Debian 7
  • 当从 Java 查询时,Sql Server 会忽略 varchar 列上的索引并进行表扫描

    问题 我有一个 SQL Server 表 其中有一个 varchar 列和数百万行 它已建立索引 从 SQL Server 查询工具中运行查询速度很快 因为它使用索引 当我从 Java JDBCPreparedStatement 运行查询时
  • Django 验证单元测试

    我试图模拟 django contrib auth 验证方法的返回值 该方法在视图的登录方法中调用 有view py代码 def login request if request method POST username get usern
  • 如何更改 Mac OS X 启动板中显示的 Java 应用程序名称

    当我的申请写成Java with SWT运行在OS X 都从下Eclipse和来自jar 它在启动板中的名称为 java 如图所示 在我的代码的开头我调用Display setAppName MyApp 并且菜单栏和菜单项中的应用程序名称是
  • PhoneGap 3.1.0 没有节点/npm 和命令行工具

    是否可以在没有节点包的情况下下载和使用 PhoneGap 3 1 0 由于网络连接受到限制 从 git hub 命令行安装节点 PhoneGap 模块 Cordova 模块和插件很烦人 使用 PhoneGap 2 9 似乎是那么容易和简单
  • 错误:无法构建 gem 本机扩展

    gem install unf ext v 0 0 6 localhost workflow boyun ryan007 gem install unf ext v 0 0 6 Building native extensions This
  • AVMutableComposition 输出冻结在第一个视频的最后一帧

    我正在尝试使用 AVMutableCompositions 将多个剪辑 视频 合并为一个 我已经成功完成了这一操作以及旋转和翻译每条指令 但是 仍然存在一个问题 当第一个剪辑完成时 输出冻结在最后一帧 第一个剪辑的最后一帧 仅当有另一个剪辑
  • 使用 VBA 声明相对于活动单元格的范围

    我需要声明一个相对于活动单元格的范围对象 问题是 每次宏运行时我想要选择的行数和列数都不同 例如 我有两个变量 numRows and numCols 我想选择一个范围 其左上角有 ActiveCell 单元格的行为 ActiveCell
  • 使用 Linq to SQL 进行多线程处理

    由于原始线程 使用 Linq to SQL 进行多线程处理 https stackoverflow com questions 1815537 现在已经很老了 我想我应该就类似的主题发布另一个问题 考虑一个场景 其中 DomainServi
  • Swift:数组内的字典

    Data firstName Foo lastName Bar firstName John lastName Doe 如何使用 swift 数组和字典拥有这种结构 该数据显示数组内的字典 对吧 所以我建议 var persons Arra
  • 从终端中的 url 运行 python 脚本

    我想知道有什么方法可以从终端中的 url www blahblah com script py 执行 python 脚本而不将文件下载到磁盘吗 Thanks 您希望它在客户端上运行 还是在服务器上运行 将返回结果 如果您想在客户端上运行它
  • 使用 REST Api Visual Studio Team Services 更新文件

    有没有办法使用 HTTP 动词更新 Visual Studio 团队服务帐户上项目中的文件内容 类似于在 github 上完成的操作https developer github com v3 repos contents update a
  • 将“最大长度”添加到正则表达式

    如何使用一个属性来扩展已经存在的正则表达式 该属性告诉正则表达式不能超过最大长度 比方说 255 我有以下正则表达式 a zA Z0 9 0 9 1 3 0 9 1 3 0 9 1 3 a zA Z0 9 a zA Z 2 4 0 9 1
  • 导入 Python 模块失败 (http.cookies)

    从我在这里和其他地方的研究中了解到 似乎如果a 模块位于Python搜索路径中或b 包含在Python搜索路径中的包中 则导入命令应该能够查找并导入模块 在下面的交互式脚本中 请注意这两个条件都已满足 http 文件夹包含一个 init p
  • 设置 Linq to NHibernate ADO 命令超时

    如何增加 NHibernate Linq To Sql 中的超时 不是连接超时 而是 ado 命令超时 using ISession session NHibernateHelper OpenSession NHibernateHelper
  • self.window 始终为零

    我目前正在尝试使用窗口控制器显示一个窗口 这就是我所拥有的 NSWindow 子类 import Cocoa import CoreLocation class TweetWindow NSWindow var locationManage