您好,有没有办法使用 SwiftUI 更改窗口级别,以便我可以为我的 mac 应用程序制作浮动窗口?我正在使用 SwiftUI 生命周期
目标是在 SwiftUI 视图层次结构的任何级别轻松访问托管窗口。目的可能不同——关闭窗口、退出第一响应者、替换根视图或 contentViewController。与 UIKit/AppKit 的集成有时也需要通过窗口路径,所以……
我在这里遇到并尝试过的东西,
像这样的东西
let keyWindow = shared.connectedScenes
.filter({$0.activationState == .foregroundActive})
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows
.filter({$0.isKeyWindow}).first
Run Code Online (Sandbox Code Playgroud)
或者通过在每个 SwiftUI 视图中添加 UIViewRepresentable/NSViewRepresentable 来使用view.window看起来丑陋、沉重且不可用的窗口。
因此,我将如何做到这一点?
使用xcode 12.3和swift 5.3与SwiftUI App生命周期构建一个macOS应用程序,什么是最好的方式来访问和更改的外观和行为NSWindow?
编辑:我真正追求的是NSWindow实例。
我添加了一个AppDelegate,但据我了解它NSWindow很可能是nil,因此无法修改,只需在此处创建一个类似于AppKit App Delegate生命周期方法的方法,就会在启动时出现两个窗口。
一种解决方案是防止默认窗口出现,并将其全部留给applicationDidFinishLaunching方法,但不确定这是可能的或明智的。
该WindowStyle协议看起来是一种可能的解决方案,但不确定CustomWindowStyle在此阶段如何最好地利用它,以及是否提供对NSWindow实例的访问以进行细粒度控制。
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
// In AppKit simply create the NSWindow and modify style.
// In SwiftUI creating an NSWindow and styling results in 2 windows,
// one styled and the other default.
}
} …Run Code Online (Sandbox Code Playgroud) 情况
实现一个多窗口应用程序,其中每个窗口都有自己的状态。
例子
这是一个展示问题的示例(在 github 上):
import SwiftUI
@main
struct multi_window_menuApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}.commands {
MenuCommands()
}
}
}
struct ContentView: View {
@StateObject var viewModel: ViewModel = ViewModel()
var body: some View {
TextField("", text: $viewModel.inputText)
.disabled(true)
.padding()
}
}
public class ViewModel: ObservableObject {
@Published var inputText: String = "" {
didSet {
print("content was updated...")
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题
我们应该如何以编程方式找出当前选定的视图是什么,以便我们可以在菜单命令即将完成时更新状态并更新视图模型中的状态?
import Foundation
import SwiftUI
import Combine
struct MenuCommands: …Run Code Online (Sandbox Code Playgroud)