微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI macos NSWindow 实例

如何解决SwiftUI macos NSWindow 实例

使用 xcode 12.3swift 5.3SwiftUI App 生命周期构建 macOS 应用程序,访问和更改 NSWindow 的外观和行为的最佳方法是什么? {1}}?

编辑:我真正想要的是 NSWindow 实例。

添加一个 AppDelegate,但据我了解,NSWindow 可能是 nil,因此无法修改,只需在此处创建一个类似于 {{ 1}} 生命周期方法导致启动时出现两个窗口。

一种解决方案是阻止认窗口出现,并将其全部留给 AppKit App Delegate 方法,但不确定这是否可行或合理。

applicationDidFinishLaunching 协议看起来是一种可能的解决方案,但不确定在此阶段如何最好地利用 WindowStyle 来利用它,以及它是否提供对 CustomWindowStyle 实例的访问细粒度控制。

NSWindow

解决方法

虽然我不完全确定这是否是正确的方法,但基于此问题的答案:https://stackoverflow.com/a/63439982/792406 我已经能够访问 NSWindow 实例并修改其外观。

为了快速参考,这里有一个基于 Asperi 使用 xcode 12.3swift 5.3 和 SwiftUI 应用生命周期提供的原始代码的工作示例。

@main
struct testApp: App {    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

class Store {
    var window: NSWindow
    
    init(window: NSWindow) {
        self.window = window
        self.window.isOpaque = false
        self.window.backgroundColor = NSColor.clear
    }
}

struct ContentView: View {
    @State private var window: NSWindow?
    var body: some View {
        VStack {
            Text("Loading...")
            if nil != window {
                MainView(store: Store(window: window!))
            }
        }.background(WindowAccessor(window: $window))
    }
}

struct MainView: View {

    let store: Store
    
    var body: some View {
        VStack {
            Text("MainView with Window: \(store.window)")
        }.frame(width: 400,height: 400)
    }
}

struct WindowAccessor: NSViewRepresentable {
    @Binding var window: NSWindow?
    
    func makeNSView(context: Context) -> NSView {
        let view = NSView()
        DispatchQueue.main.async {
            self.window = view.window
        }
        return view
    }
    
    func updateNSView(_ nsView: NSView,context: Context) {}
}
,

有趣的方法@hillmark。

我还通过使用 NSApplicationDelegateAdaptor 的方法使其工作。

我相信下面的代码只能帮助您处理单窗口 MacOS SwiftUI 应用程序 - 多窗口应用程序可能需要处理所有窗口,而不仅仅是处理第一个。

我也不确定我的方法有什么注意事项。

现在这正好解决了我的问题,但我也会检查你的方法。

import SwiftUI

final class AppDelegate: NSObject,NSApplicationDelegate {
    func applicationDidFinishLaunching(_ notification: Notification) {
        if let window = NSApplication.shared.windows.first {
            window.titleVisibility = .hidden
            window.titlebarAppearsTransparent = true
            window.isOpaque = false
            window.backgroundColor = NSColor.clear
        }
    }
}

@main
struct AlreadyMacOSApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var delegate
    var body: some Scene {
        WindowGroup {
            NewLayoutTest()
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。