macOS使用SwiftUI开发平替AppKit
macOS使用SwiftUI开发平替AppKit

macOS使用SwiftUI开发平替AppKit

最近学习macOS AppKit API,至少学习了42个macOS AppKit API,在学习过程中发现,大部分AppKit API基本可以被SwiftUI平替,平替的结果就是在开发mac应用的过程中,不需要再学习多余的AppKit API,只需要掌握SwiftUI,降低学习成本。

但是macOS上的部分功能仍然需要AppKit API实现,特别是需要自定义或高级配置,SwiftUI还没有API提供支持,就需要去学习这部分AppKit的API。

下面是罗列的是macOS AppKit 常用的API,涉及了视图、控件、容器、窗口/控制器、颜色/几何/事件/状态栏等多个层面。将它们分为几大类,并一一分析哪些已可被 SwiftUI 平替,哪些仍需使用 AppKit,以便在 macOS 11+ 的 SwiftUI 开发中灵活使用。

1、通用UI控件类

1、NSButton:SwiftUI 平替 Button,完全替代,包括图标、文字、样式等。

2、NSTextField:SwiftUI 平替TextField、SecureField和TextEditor,大部分情况都可以平替,支持绑定。

3、NSTextView:SwiftUI平替TextEditor,基本替代(复杂功能需桥接)。

4、NSSlider:SwiftUI 平替Slider,支持绑定、样式控制。

5、NSPopUpButton:SwiftUI平替Picker,可用 Picker + MenuStyle 实现下拉选择。

6、NSForm:SwiftUI平替Form,完全支持。

7、NSComboBox:SwiftUI平替Picker + TextField,无完全平替(需组合实现)。

8、NSColorWell:SwiftUI平替ColorPicker,macOS 11+ 中 SwiftUI 原生支持颜色选择。

9、NSTableView:SwiftUI部分平替List + Grid(简单表格/列表),Table(SwiftUI 3,macOS 12+引入),如果支持macOS 12+,使用Table,支持macOS11及以下,仍需嵌套AppKit NSTableView(可用 NSViewRepresentable 封装)。

10、NSLayoutManager / NSTextStorage / NSTextContainer:❌SwiftUI不涉及文本排版底层组件。

11、NSProgressIndicator:SwiftUI平替ProgressView,加载指示器,支持 determinate/indeterminate。

12、NSSegmentedControl:SwiftUI平替Picker + segmented 样式,分段选择器。

13、NSPageController:SwiftUI平替TabView, TabViewStyle.page,分页控制器,部分平替。

14、NSLevelIndicator:SwiftUI平替自定义 ProgressView / 条形图,用于电量/评分等级条。

15、NSMatrix:SwiftUI平替Grid + Toggle/RadioButton,需组合使用。

16、NSRadioButton / NSButtonCell:SwiftUI平替Picker, Toggle, 自定义 Radio,单选按钮,需手动实现 Radio 样式。

17、NSCheckBox:SwiftUI平替Toggle,复选框,完全替代。

18、NSSearchField:SwiftUI平替TextField + .searchField 样式,样式控制有限。

19、NSAlert:SwiftUI平替 .alert(),平替(复杂提示需桥接)。

2、容器/布局视图

1、NSView:SwiftUI平替View 协议 + 各种容器(VStack、HStack、ZStack、GeometryReader),完全替代,一切 UI 的基础。

2、NSScrollView:SwiftUI平替ScrollView,原生支持纵向/横向滚动内容。

3、NSSplitView:SwiftUI平替NavigationSplitView, HSplitView, VSplitView (macOS 13+),SwiftUI 3 起支持,使用简单直观。

4、NSToolbar:SwiftUI平替toolbar 修饰符,macOS 11+ 支持,为窗口添加工具栏项。

5、NSPopover:SwiftUI平替popover,完整平替。

6、NSPanel:SwiftUI平替.sheet.popover,自定义 WindowGroup,需判断具体用途,一般能替代。

7、accessoryView:❌SwiftUI无平替,需 AppKit(SwiftUI 无法自定义 NSOpenPanel 的附加视图)。

8、NSStackView:SwiftUI平替VStack, HStack,垂直/水平布局容器。

9、NSBox:SwiftUI平替Group, Divider, Section,分割线/分组框。

3、状态栏/菜单栏

1、NSStatusBar / NSStatusItem / NSStatusBarButton:SwiftUI平替MenuBarExtra,完全替代(macOS 13+)。

2、NSMenu / NSMenuItem:SwiftUI平替Menu视图,SwiftUI 的 Menu 支持上下文和常规菜单。

3、NSOpenPanel / NSSavePanel:SwiftUI平替FileImporter / FileExporter,SwiftUI 原生替代(配合 document scene)。

4、NSMenuItem.validate():❌无SwiftUI平替,动态菜单项状态需 AppKit 管理菜单逻辑。

4、图像、媒体

1、NSImageView:SwiftUI平替Image,完全替代。

2、NSImage:SwiftUI平替Image(nsImage:),可桥接显示NSImage。

3、NSMovieView,SwiftUI平替VideoPlayer(AVKit),使用SwiftUI + AVKit播放视频。

5、颜色/外观/空间几何

1、NSAppearance:SwiftUI平替 .preferredColorScheme / .colorScheme,可控制 Light/Dark 模式。

2、NSColor:SwiftUI平替Color,完全替代,支持多平台。

3、NSColorPanel:SwiftUI平替ColorPicker,简化替代,若需独立弹出面板仍需 AppKit。

4、NSColorPicker:❌暂无 SwiftUI 平替,属于系统插件协议,SwiftUI 不支持注册扩展插件。

5、NSSize / NSPoint / NSRect:SwiftUI平替CGSize / CGPoint / CGRect,CoreGraphics 与 SwiftUI 通用。

6、拖放、事件响应

1、NSDraggingDestination:SwiftUI平替 .onDrop 功能有限,但不支持高级拖放行为。

2、NSPasteboard:❌SwiftUI无平替,剪贴板读写需要手动桥接AppKit。

3、NSDraggingSource:❌SwiftUI无平替,拖放源。

4、NSDraggingItem,❌SwiftUI无平替,拖放内容。

5、NSEvent:❌SwiftUI无平替,SwiftUI 不支持低层次事件,如果需要监听键盘、鼠标事件等,仍需 AppKit。

6、NSResponder,❌SwiftUI无平替,SwiftUI 不暴露 responder chain,需要响应链时必须配合 AppKit 使用。

7、NSWorkspace:❌SwiftUI无平替,但是可以在SwiftUI中直接调用,只需导入AppKit。

8、NSApplication:SwiftUI提供部分封装功能,@main 的 App 结构体封装了基本 NSApplication 生命周期,也可以在SwiftUI中直接调用NSApplication的方法。

7、文档架构类

1、NSDocument:SwiftUI平替DocumentGroup (macOS 11+),SwiftUI 提供简化模型,复杂文档仍需 AppKit。

2、NSDocumentController:❌SwiftUI 默认不提供多文档控制器;如需复杂管理需使用 AppKit。

8、控制器类

1、NSWindow:SwiftUI平替WindowGroup, .windowStyle,可生成窗口,但需特殊控制仍需用 NSWindowController。

2、NSWindowController: ❌SwiftUI无对应,SwiftUI 无窗口控制器,需结合 AppKit 管理窗口生命周期。

3、NSViewController:View + @Environment(\.presentationMode),可部分模拟,复杂页面管理仍需 NSViewController。

4、NSSplitViewController:SwiftUI平替NavigationSplitView、SplitView, HSplitView, VSplitView,可完全替代(macOS 13+)。

其他系统组件

1、NSUserDefaults:SwiftUI平替@AppStorage,用户默认值存储。

2、NSFileManager:SwiftUI平替FileManager,直接使用。

3、NSCoder:SwiftUI 无需显式编码/解码视图,NSCoder 用于归档 NSView。

总结

在使用SwiftUI开发macOS应用的过程中,如果需要兼容macOS 11、macOS 12及以前的版本,可能还需要SwiftUI + AppKit混合开发,需要桥接使用AppKit的代码。

如果开发macOS 13+,简单的应用基本都可以通过SwiftUI实现,个别复杂功能可能需要在macOS 14+等版本中使用。

在考虑macOS开发版本的过程中,可以参考《如何选择macOS最低版本?》。

虽然很多AppKit控制器,基本无法在SwiftUI中使用,但SwiftUI也可以通过 scenePhase 实现基本的生命周期管理。

另外,简单的功能基本都可以在SwiftUI中找到平替,对于一些高度自定义的功能,AppKit可能更适合,就需要桥接使用。

相关文章

1、如何选择macOS最低版本?:https://fangjunyu.com/2025/06/18/%e5%a6%82%e4%bd%95%e9%80%89%e6%8b%a9macos%e6%9c%80%e4%bd%8e%e7%89%88%e6%9c%ac%ef%bc%9f/

2、SwiftUI监听应用生命周期变化的scenePhase:https://fangjunyu.com/2024/12/14/swiftui%e7%9b%91%e5%90%ac%e5%ba%94%e7%94%a8%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f%e5%8f%98%e5%8c%96%e7%9a%84scenephase/

3、macOS按钮NSButton:https://fangjunyu.com/2025/07/02/macos%e6%8c%89%e9%92%aensbutton/

4、macOS文本内容NSTestField:https://fangjunyu.com/2025/07/03/macos%e6%96%87%e6%9c%ac%e5%86%85%e5%ae%b9nstestfield/

5、Swift 文本输入方法TextEditor和TextField:https://fangjunyu.com/2024/11/03/swift-%e6%96%87%e6%9c%ac%e8%be%93%e5%85%a5%e6%96%b9%e6%b3%95texteditor%e5%92%8ctextfield/

6、macOS滑块NSSlider:https://fangjunyu.com/2025/07/02/macos%e6%bb%91%e5%9d%97nsslider/

7、SwiftUI滑块视图组件Slider:https://fangjunyu.com/2025/01/10/swiftui%e6%bb%91%e5%9d%97%e8%a7%86%e5%9b%be%e7%bb%84%e4%bb%b6slider/

8、macOS下拉菜单NSPopUpButton:https://fangjunyu.com/2025/06/28/macos%e4%b8%8b%e6%8b%89%e8%8f%9c%e5%8d%95nspopupbutton/

9、SwiftUI多选项视图组件Picker:https://fangjunyu.com/2025/01/10/swiftui%e5%a4%9a%e9%80%89%e9%a1%b9%e8%a7%86%e5%9b%be%e7%bb%84%e4%bb%b6picker/

10、SwiftUI表单Form:https://fangjunyu.com/2025/07/05/swiftui%e8%a1%a8%e5%8d%95form/

11、mac颜色选择控件NSColorWell:https://fangjunyu.com/2025/07/01/mac%e9%a2%9c%e8%89%b2%e9%80%89%e6%8b%a9%e6%8e%a7%e4%bb%b6nscolorwell/

12、SwiftUI表格Table:https://fangjunyu.com/2025/07/05/swiftui%e8%a1%a8%e6%a0%bctable/

13、SwiftUI进度指示器ProgressView:https://fangjunyu.com/2025/01/10/swiftui%e8%bf%9b%e5%ba%a6%e6%8c%87%e7%a4%ba%e5%99%a8progressview/

14、SwiftUI选项卡式视图切换TabView:https://fangjunyu.com/2024/12/09/swiftui%e9%80%89%e9%a1%b9%e5%8d%a1%e5%bc%8f%e8%a7%86%e5%9b%be%e5%88%87%e6%8d%a2tabview/

15、SwiftUI开关控件Toggle:https://fangjunyu.com/2025/01/01/swiftui%e5%bc%80%e5%85%b3%e6%8e%a7%e4%bb%b6toggle/

16、SwiftUI Alert提示框:https://fangjunyu.com/2024/12/07/swift-alert%e6%8f%90%e7%a4%ba%e6%a1%86/

17、SwiftUI列表List:https://fangjunyu.com/2025/07/05/swiftui%e5%88%97%e8%a1%a8list/

18、SwiftUI颜色控件ColorPicker:https://fangjunyu.com/2025/07/02/swiftui%e9%a2%9c%e8%89%b2%e6%8e%a7%e4%bb%b6colorpicker/

19、macOS视图NSView:https://fangjunyu.com/2025/07/01/macos%e8%a7%86%e5%9b%bensview/

20、SwiftUI容器视图GeometryReader:https://fangjunyu.com/2024/12/15/swiftui%e5%ae%b9%e5%99%a8%e8%a7%86%e5%9b%begeometryreader/

21、macOS滚动视图NSScrollView:https://fangjunyu.com/2025/07/03/macos%e6%bb%9a%e5%8a%a8%e8%a7%86%e5%9b%bensscrollview/

22、SwiftUI滚动内容ScrollView:https://fangjunyu.com/2024/12/20/swiftui%e6%bb%9a%e5%8a%a8%e5%86%85%e5%ae%b9scrollview/

23、macOS子视图区域NSSplitView:https://fangjunyu.com/2025/07/03/macos%e5%ad%90%e8%a7%86%e5%9b%be%e5%8c%ba%e5%9f%9fnssplitview/

24、SwiftUI多栏导航界面NavigationSplitView:https://fangjunyu.com/2024/12/21/swiftui%e5%a4%9a%e6%a0%8f%e5%af%bc%e8%88%aa%e7%95%8c%e9%9d%a2navigationsplitview/

25、macOS工具栏NSToolbar:https://fangjunyu.com/2025/07/03/macos%e5%b7%a5%e5%85%b7%e6%a0%8fnstoolbar/

26、SwiftUI在iOS中的toolbar工具栏:https://fangjunyu.com/2024/12/07/swift-toolbar%e5%b7%a5%e5%85%b7%e6%a0%8f/

27、macOS浮动窗口NSPopover:https://fangjunyu.com/2025/06/29/macos%e6%b5%ae%e5%8a%a8%e7%aa%97%e5%8f%a3nspopover/

28、SwiftUI iPad显示浮窗popover:https://fangjunyu.com/2025/01/02/swiftui-ipad%e6%98%be%e7%a4%ba%e6%b5%ae%e7%aa%97popover/

29、macOS浮窗NSPanel:https://fangjunyu.com/2025/07/02/macos%e6%b5%ae%e7%aa%97nspanel/

30、macOS文件对话框自定义视图accessoryView:https://fangjunyu.com/2025/06/28/macos%e6%96%87%e4%bb%b6%e5%af%b9%e8%af%9d%e6%a1%86%e8%87%aa%e5%ae%9a%e4%b9%89%e8%a7%86%e5%9b%beaccessoryview/

31、SwiftUI透明布局容器Group:https://fangjunyu.com/2024/12/23/swiftui%e9%80%8f%e6%98%8e%e5%b8%83%e5%b1%80%e5%ae%b9%e5%99%a8group/

32、SwiftUI Divider分割线:https://fangjunyu.com/2025/06/11/swiftui-divider%e5%88%86%e5%89%b2%e7%ba%bf/

33、SwiftUI List和Form的分组视图Section:https://fangjunyu.com/2025/01/13/swiftui-list%e5%92%8cform%e7%9a%84%e5%88%86%e7%bb%84%e8%a7%86%e5%9b%besection/

34、Swift弹出sheet视图:https://fangjunyu.com/2024/11/25/swift%e5%bc%b9%e5%87%basheet%e8%a7%86%e5%9b%be/

35、macOS状态栏图标(系统右上角)NSStatusBar:https://fangjunyu.com/2025/06/24/macos%e7%8a%b6%e6%80%81%e6%a0%8f%e5%9b%be%e6%a0%87%ef%bc%88%e7%b3%bb%e7%bb%9f%e5%8f%b3%e4%b8%8a%e8%a7%92%ef%bc%89nsstatusbar/

36、macOS状态栏图标关键组件NSStatusItem:https://fangjunyu.com/2025/06/26/macos%e8%8f%9c%e5%8d%95%e6%a0%8f%e5%9b%be%e6%a0%87%e5%85%b3%e9%94%ae%e7%bb%84%e4%bb%b6nsstatusitem/

37、macOS状态栏图标按钮类NSStatusBarButton:https://fangjunyu.com/2025/06/26/macos%e7%8a%b6%e6%80%81%e6%a0%8f%e5%9b%be%e6%a0%87%e6%8c%89%e9%92%ae%e7%b1%bbnsstatusbarbutton/

38、macOS顶部和上下文菜单NSMenu:https://fangjunyu.com/2025/06/23/macos%e9%a1%b6%e9%83%a8%e5%92%8c%e4%b8%8a%e4%b8%8b%e6%96%87%e8%8f%9c%e5%8d%95nsmenu/

39、macOS单个菜单项类NSMenuItem:https://fangjunyu.com/2025/06/25/macos%e5%8d%95%e4%b8%aa%e8%8f%9c%e5%8d%95%e9%a1%b9%e7%b1%bbnsmenuitem/

40、SwiftUI可操作选项视图Menu:https://fangjunyu.com/2024/11/08/swiftui%e5%8f%af%e6%93%8d%e4%bd%9c%e9%80%89%e9%a1%b9%e8%a7%86%e5%9b%bemenu/

41、SwiftUI状态栏MenuBarExtra:https://fangjunyu.com/2025/06/29/macos%e7%8a%b6%e6%80%81%e6%a0%8fmenubarextra/

42、macOS文件选择对话框NSOpenPanel:https://fangjunyu.com/2025/06/27/macos%e6%96%87%e4%bb%b6%e9%80%89%e6%8b%a9%e5%af%b9%e8%af%9d%e6%a1%86nsopenpanel/

43、macOS保存文件的对话框NSSavePanel:https://fangjunyu.com/2025/06/27/macos%e4%bf%9d%e5%ad%98%e6%96%87%e4%bb%b6%e7%9a%84%e5%af%b9%e8%af%9d%e6%a1%86nssavepanel/

44、SwiftUI导入外部文件Fileimporter:https://fangjunyu.com/2025/07/05/swiftui%e5%af%bc%e5%85%a5%e5%a4%96%e9%83%a8%e6%96%87%e4%bb%b6fileimporter/

45、SwiftUI保存文件FileExporter:https://fangjunyu.com/2025/07/05/swiftui%e4%bf%9d%e5%ad%98%e6%96%87%e4%bb%b6fileexporter/

46、Swift显示图像的Image类:https://fangjunyu.com/2024/11/22/swift%e6%98%be%e7%a4%ba%e5%9b%be%e5%83%8f%e7%9a%84image%e7%b1%bb/

47、MacOS图像显示类NSImage:https://fangjunyu.com/2024/11/22/macos%e5%9b%be%e5%83%8f%e6%98%be%e7%a4%ba%e7%b1%bbnsimage/

48、Apple多媒体框架AVFoundation:https://fangjunyu.com/2024/12/11/apple%e5%a4%9a%e5%aa%92%e4%bd%93%e6%a1%86%e6%9e%b6avfoundation/

49、SwiftUI检测浅色或深色模式:https://fangjunyu.com/2025/01/09/swiftui%e6%a3%80%e6%b5%8b%e6%b5%85%e8%89%b2%e6%88%96%e6%b7%b1%e8%89%b2%e6%a8%a1%e5%bc%8f/

50、macOS用户界面外观风格NSAppearance:https://fangjunyu.com/2025/07/02/macos%e7%94%a8%e6%88%b7%e7%95%8c%e9%9d%a2%e5%a4%96%e8%a7%82%e9%a3%8e%e6%a0%bcnsappearance/

51、macOS颜色NSColor:https://fangjunyu.com/2025/07/01/macos%e9%a2%9c%e8%89%b2nscolor/

52、macOS颜色选择面板NSColorPanel:https://fangjunyu.com/2025/07/02/macos%e9%a2%9c%e8%89%b2%e9%80%89%e6%8b%a9%e9%9d%a2%e6%9d%bfnscolorpanel/

53、SwiftUI颜色控件ColorPicker:https://fangjunyu.com/2025/07/02/swiftui%e9%a2%9c%e8%89%b2%e6%8e%a7%e4%bb%b6colorpicker/

54、macOS颜色面板插件接口NSColorPicker:https://fangjunyu.com/2025/07/02/macos%e9%a2%9c%e8%89%b2%e9%9d%a2%e6%9d%bf%e6%8f%92%e4%bb%b6%e6%8e%a5%e5%8f%a3nscolorpicker/

55、macOS尺寸NSSize:https://fangjunyu.com/2025/07/01/macos%e5%b0%ba%e5%af%b8nssize/

56、macOS二维空间点NSPoint:https://fangjunyu.com/2025/07/01/macos%e4%ba%8c%e7%bb%b4%e7%a9%ba%e9%97%b4%e7%82%b9nspoint/

57、macOS矩形NSRect:https://fangjunyu.com/2025/07/01/macos%e7%9f%a9%e5%bd%a2nsrect/

58、Apple二维图像绘制框架Core Graphics:https://fangjunyu.com/2024/12/16/apple%e4%ba%8c%e7%bb%b4%e5%9b%be%e5%83%8f%e7%bb%98%e5%88%b6%e6%a1%86%e6%9e%b6core-graphics/

59、macOS拖放行为NSDraggingDestination:https://fangjunyu.com/2025/07/04/macos%e6%8b%96%e6%94%be%e8%a1%8c%e4%b8%bansdraggingdestination/

60、SwiftUI拖放操作onDrop:https://fangjunyu.com/2025/07/04/swiftui%e6%8b%96%e6%94%be%e6%93%8d%e4%bd%9condrop/

61、macOS用户输入事件NSEvent:https://fangjunyu.com/2025/07/04/macos%e7%94%a8%e6%88%b7%e8%be%93%e5%85%a5%e4%ba%8b%e4%bb%b6nsevent/

62、macOS UI控件父类NSResponder:https://fangjunyu.com/2025/07/03/macos-ui%e6%8e%a7%e4%bb%b6%e7%88%b6%e7%b1%bbnsresponder/

63、macOS应用管理类NSWorkspace:https://fangjunyu.com/2025/06/22/macos%e5%ba%94%e7%94%a8%e7%ae%a1%e7%90%86%e7%b1%bbnsworkspace/

64、macOS核心对象NSApplication:https://fangjunyu.com/2025/06/19/macos%e6%a0%b8%e5%bf%83%e5%af%b9%e8%b1%a1nsapplication/

65、macOS构建文档的NSDocument:https://fangjunyu.com/2025/07/03/macos%e6%9e%84%e5%bb%ba%e6%96%87%e6%a1%a3%e7%9a%84nsdocument/

66、macOS文档控制器NSDocumentController:https://fangjunyu.com/2025/07/03/macos%e6%96%87%e6%a1%a3%e6%8e%a7%e5%88%b6%e5%99%a8nsdocumentcontroller/

67、SwiftUI文档类型DocumentGroup:https://fangjunyu.com/2025/07/05/swiftui%e6%96%87%e6%a1%a3%e7%b1%bb%e5%9e%8bdocumentgroup/

68、macOS窗口NSWindow:https://fangjunyu.com/2025/07/01/macos%e7%aa%97%e5%8f%a3nswindow/

69、macOS管理窗口的控制器类NSWindowController:https://fangjunyu.com/2025/06/30/macos%e7%ae%a1%e7%90%86%e7%aa%97%e5%8f%a3%e7%9a%84%e6%8e%a7%e5%88%b6%e5%99%a8%e7%b1%bbnswindowcontroller/

70、macOS管理视图的NSViewController:https://fangjunyu.com/2025/07/01/macos%e7%ae%a1%e7%90%86%e8%a7%86%e5%9b%be%e7%9a%84nsviewcontroller/

71、macOS分栏控制器NSSplitViewController:https://fangjunyu.com/2025/07/04/macos%e5%88%86%e6%a0%8f%e6%8e%a7%e5%88%b6%e5%99%a8nssplitviewcontroller/

72、Swift存储属性包装器@AppStorage:https://fangjunyu.com/2024/10/28/swift%e5%ad%98%e5%82%a8%e5%b1%9e%e6%80%a7%e5%8c%85%e8%a3%85%e5%99%a8appstorage/

73、Swift 管理文件的FileManager类:https://fangjunyu.com/2024/11/03/swift-%e7%ae%a1%e7%90%86%e6%96%87%e4%bb%b6%e7%9a%84filemanager%e7%b1%bb/

74、macOS对象编解码NSCoder:https://fangjunyu.com/2025/07/04/macos%e5%af%b9%e8%b1%a1%e7%bc%96%e8%a7%a3%e7%a0%81nscoder/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注