macOS下Swift实现外接显示器打开NSWindow/NSView的问题排查
代码存在的问题如下:
- NSWindow初始化时
defer参数传值错误:你传入了true,该参数为true时系统会延迟窗口缓存创建,在外接屏幕场景下容易出现坐标计算异常,无法正常渲染窗口,改为false即可。 - 可选项强制解包存在崩溃风险:直接用
!解包externalDisplay,极端情况下如果枚举屏幕过程中外接屏幕断开会触发崩溃,建议用if let/guard let安全解包。 - 缺少窗口去重逻辑:多次点击按钮会重复创建多个窗口,增加不必要的性能开销。
- 可选排查点:确认按钮和
showExternalDisplayButtonClicked方法已正确绑定,可在方法内添加打印日志验证点击时方法是否被触发。
修正后的完整代码:
import Cocoa class ViewController: NSViewController { var externalDisplay: NSScreen? var fullScreenWindow: NSWindow? var fullScreenView: NSView? override func viewDidLoad() { super.viewDidLoad() } override var representedObject: Any? { didSet { } } @IBAction func showExternalDisplayButtonClicked(sender: Any?) { // 已创建窗口则直接显示,避免重复创建 if let existingWindow = fullScreenWindow { existingWindow.makeKeyAndOrderFront(self) return } // 安全校验外接屏幕存在 guard NSScreen.screens.count > 1, let targetScreen = NSScreen.screens.last else { return } externalDisplay = targetScreen let externalDisplayRect = targetScreen.frame // defer参数改为false,立即完成窗口初始化 fullScreenWindow = NSWindow(contentRect: externalDisplayRect, styleMask: .borderless, backing: .buffered, defer: false, screen: targetScreen) guard let fullScreenWindow = fullScreenWindow else { return } fullScreenWindow.level = .normal fullScreenWindow.isOpaque = true fullScreenWindow.hidesOnDeactivate = false fullScreenWindow.backgroundColor = .red let viewRect = NSRect(x: 0, y: 0, width: targetScreen.frame.width, height: targetScreen.frame.height) fullScreenView = NSView(frame: viewRect) fullScreenWindow.contentView = fullScreenView fullScreenWindow.makeKeyAndOrderFront(self) } }
内容的提问来源于stack exchange,提问作者SouthernYankee65
相关产品推荐
相关产品推荐

