【问题标题】:macOS: Is there a way to access the window controller without crashing?macOS:有没有办法在不崩溃的情况下访问窗口控制器?
【发布时间】:2020-01-04 01:23:50
【问题描述】:

我必须通过这样做来访问 windowController

let windowController = NSApplication.shared.mainWindow?.windowController as! WindowController

当我尝试在 viewDidAppear 中运行它时,应用程序会因此崩溃

线程 1:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

我在网上找到的解决方案是在访问windowController之前添加这一行:

NSApp.activate(ignoringOtherApps: true) 

此行使应用程序处于活动状态。

但是这种方法并不能真正解决任何问题,因为如果在我的应用加载时另一个应用成为前面的应用,我的应用就会崩溃。

有什么办法可以做到吗?

【问题讨论】:

  • (1) 如果您不想让应用程序崩溃,请不要强制解包变量。 (2) 你做错了。视图控制器在出现之前并不知道它的窗口控制器。
  • IDK 怎么说这个而不听起来像个混蛋,但从我最近看到的你的问题来看,我越来越明显地看到,你将从全面和结构化的资源中受益匪浅,比如一门课程或一本厚厚的书。我完全赞成“黑客方式”,但您似乎正在从零碎学习的失败中挣扎,而不是拥有完整的完整课程体验
  • @Alexander AppKit 有它的怪癖。感觉有些部分是由不熟悉 AppKit 的工程师从 iOS 移植过来的。
  • @Willeke 这个加上撒旦写的文档,结果浪费了很多时间和变通方法。
  • 您要解决的核心问题是什么?是访问包含你的视图控制器的视图的窗口对应的窗口控制器吗?

标签: swift macos cocoa swift4 nswindowcontroller


【解决方案1】:

您的视图控制器被加载并不意味着它已经呈现在屏幕上,甚至位于您的窗口中。很明显,你不能从viewDidLoad做窗口相关的代码。

相反,您可能应该将NSWindowDelegate 注册到您的窗口,但最佳操作方案很大程度上取决于您要对窗口执行的操作。

【讨论】:

  • 就像我怀疑的那样,您的解决方案也会导致崩溃。我已经分配了一个委托方法windowDidBecomeMain 来完成这项任务。当我尝试访问NSApp.mainWindow 时,它是零。我会尝试使用其他委托方法。
  • NSApp.mainWindow 在应用失去焦点时变为 nil。除非我可以保持应用程序处于活动状态并阻止 macOS 将其置于后台,否则我看不到任何解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2018-10-22
  • 2012-04-06
相关资源
最近更新 更多