swift - 如何以编程方式在 macOS(不是 iOS)上的 SwiftUI 中从后台打开应用程序窗口?
问题描述
我有一个非常简单的 SwiftUI 应用程序,它在菜单栏中运行,并且应该从后台的重复计时器中定期打开一个应用程序窗口(整个应用程序中只有一个窗口/视图)。
我如何从代码中实际打开应用程序窗口?
这是一个简化的AppDelegate.swift
示例,显示了我正在尝试做的事情:
import Cocoa
import SwiftUI
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Create the SwiftUI view that provides the window contents.
let contentView = ContentView()
// Create the window and set the content view.
window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.center()
window.setFrameAutosaveName("Main Window")
window.contentView = NSHostingView(rootView: contentView)
window.makeKeyAndOrderFront(nil)
var loop = 0
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
loop+=1
if (loop % 10 == 0) {
// TODO: How to close the window?
} else {
// TODO: How to reopen the window?
}
}
}
}
解决方案
一种方法是隐藏/取消隐藏应用程序本身
func applicationDidFinishLaunching(_ aNotification: Notification) {
//setup of window etc ...
Timer.scheduledTimer(withTimeInterval: 3, repeats: true, block: { _ in
if self.window.isVisible {
NSApp.hide(self)
} else {
NSApp.unhide(self)
}
})
}
推荐阅读
- r - 如何根据列匹配有效地将这些 imdb 电影标题 ID 替换为实际标题?
- python - 根据单个单元格中的多个值对熊猫数据框进行排序
- java - 如何在 RCON 中读取服务器上的聊天记录
- python - Python aiohttp电机引擎
- json - SOAPUI:使用 groovy 运行测试步骤而不修改测试步骤主体
- amazon-web-services - aws elasticbeanstalk意外错误0000000001?
- python - 在 Numpy 中,如何根据元素的绝对值的最大值来选择元素?
- vue.js - UI 框架的“单个组件导入”实践是否使 Vue js 应用程序性能更好?
- python - 如何使用上下值按字母顺序对字符串列表进行排序?
- javascript - 无法读取 React JS Hook 中的道具