SwiftUI macOS 如何新建一个Windows窗口并显示

SwiftUI macOS 如何新建一个Windows窗口并显示 教程含源码


SwiftUI macOS 如何新建一个Windows窗口并显示 教程含源码

SwiftUI macOS 如何新建一个Windows窗口并显示

本人实践完成的效果

SwiftUI macOS 如何新建一个Windows窗口并显示


看完本文您将掌握的技能

  • 掌握创建新Windows方法
  • 实现SwiftUI原生调用

基础知识

NSHostingController

托管SwiftUI视图层次结构的AppKit视图控制器。

class NSHostingController<Content> where Content : View

总览

当您要将SwiftUI视图集成到AppKit视图层次结构中时,创建一个对象。在创建时,指定要用作此视图控制器的根视图的SwiftUI视图;您可以稍后使用属性更改该视图。通过将其呈现为子视图控制器或将其嵌入到界面中,可以像使用其他任何视图控制器一样使用托管控制器。NSHostingControllerrootView.


主题

创建一个主机控制器对象

1、init(rootView: Content)
创建一个宿主控制器对象,该对象包装指定的SwiftUI视图。
2、init?(coder: NSCoder, rootView: Content)
从档案和指定的SwiftUI视图创建托管控制器对象。
3、init(nibName: NSNib.Name?, bundle: Bundle?)
根据指定的nib文件的内容创建托管控制器对象。
4、init?(coder: NSCoder)
根据指定档案的内容创建一个托管控制器对象。


获取根视图

6、var rootView: Content
此视图控制器管理的SwiftUI视图层次结构的根视图。


配置界面外观

7、func sizeThatFits(in: CGSize) -> CGSize
计算并返回当前视图的最合适大小。


比较视图控制器

8、static func == (NSObject, NSObject) -> Bool
返回一个布尔值,该值指示两个值是否相等。NSObject通过调用实现此功能。lhs.isEqual(rhs)
9、static func != (NSHostingController, NSHostingController) -> Bool


获取哈希信息

10、var hashValue: Int
哈希值。
11、func hash(into: inout Hasher)
通过将这些值的必需成分输入给定的哈希值来对其进行哈希处理。


结构

12、struct KeyValueObservingPublisher
当符合KVO的属性的值更改时发出事件的发布者。
struct TransitionOptions


实例属性

var identifier: NSUserInterfaceItemIdentifier?


代码

import SwiftUI
import Cocoa

struct ContentView: View {
    var body: some View {
        VStack{
            Spacer()
            Button("打开新窗口"){
                let detailView = DetailView()

                let controller = DetailWC(rootView: detailView)
                controller.window?.title = "新窗口"
                controller.showWindow(nil)
            }
            Spacer()
            Divider()
        }
        .frame(width: 600, height: 500)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}





class DetailWC<RootView : View>: NSWindowController {
    convenience init(rootView: RootView) {
        let hostingController = NSHostingController(rootView: rootView.frame(width: 400, height: 500))
        let window = NSWindow(contentViewController: hostingController)
        window.setContentSize(NSSize(width: 400, height: 500))
        self.init(window: window)
    }
}

struct DetailView: View {
    var body: some View {
        VStack{
            Spacer()
           Text("我是新窗口")
            Spacer()
        }
    }
}
上一篇:Android 学习记录 - 动态加载布局


下一篇:水水水水水水