从 AppKit NSButton 打开新的 SwiftUI 窗口

Posted

技术标签:

【中文标题】从 AppKit NSButton 打开新的 SwiftUI 窗口【英文标题】:Open New SwiftUI Window from AppKit NSButton 【发布时间】:2021-01-29 18:24:29 【问题描述】:

我想在 AppKit 应用程序内的新窗口弹出窗口中显示 SwiftUI 视图。我目前正在情节提要中执行此操作,方法是将ShowNSButton 转为NSViewController

我正在尝试在这样的代码中执行此操作:

@IBAction func clickTest(_ sender: NSButton) 
  let prefsView = NSHostingController(rootView: PreferencesView())
  self.presentAsModalWindow(prefsView) //I don't know how to do a regular "Show"

当我点击按钮时,我知道一个模式正在出现,但它是不可见的。我知道它在那里,因为当我尝试点击我的主应用程序窗口时听到NSBeep 的声音。我还可以在窗口菜单中看到Untitled 窗口。

这里是PreferencesView()

import SwiftUI

struct PreferencesView: View 
  var body: some View 
    Text("Hello, World!")
  


struct PreferencesView_Previews: PreviewProvider 
  static var previews: some View 
    PreferencesView()
  

我还需要做些什么来让一个带有我的 SwiftUI 视图的窗口出现在其中吗?

【问题讨论】:

【参考方案1】:

我想通了。它需要 AppKit 的一点帮助。您必须创建一个新的 NSWindowController 并使用它来容纳您的 SwiftUI 视图 (NSHostingController):

@IBAction func clickTest(_ sender: NSButton) 
  //SwiftUI wrapper
  let hostingController = NSHostingController(rootView: PreferencesView())

  //New window holding our SwiftUI view
  let window = NSWindow(contentViewController: hostingController)
  window.setContentSize(NSSize(width: 380, height: 400))
  
  //Create a new window controller and show the window   
  let controller = NSWindowController(window: window)
  controller.showWindow(nil)

如果有人知道更好的方法,我会全力以赴。 :)

【讨论】:

以上是关于从 AppKit NSButton 打开新的 SwiftUI 窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个打开另一个窗口(Mac)的 NSButton?

从 NSView 发送动作,就像使用 NSButton

oc之学习Mac开发第一弹 认识 NSButton

带有延迟 NSMenu 的 NSButton - Objective-C/Cocoa

MacOS-从 UIKit 到 AppKit

在 Mac Catalyst 中打开一个新窗口