Mac应用中Storyboard与Swift/SwiftUI关联方法及报错解决
Mac应用中Storyboard与SwiftUI关联的正确方式及代码错误修复
先明确你的核心疑问:通过IBSegueAction从Storyboard跳转至NSHostingController是Mac应用中关联Storyboard与SwiftUI的正确方式之一,不过你的代码存在几个基础问题导致报错,下面逐个分析并给出修复方案:
错误原因拆解
你的四个错误本质是两个核心问题导致的:
- 缺失SwiftUI框架导入:
NSHostingView和NSHostingController都是SwiftUI提供的桥接AppKit的类,不属于原生Cocoa框架,仅导入Cocoa找不到这些类型。 - 不必要的自定义
NSHostingView:处理segue跳转是ViewController的职责,不需要继承NSHostingView来实现。而且NSHostingView本身没有draw(_:)方法,你重写这个方法自然会提示“未覆盖超类方法”,同时错误地把它当作可继承的根类操作,也会出现无法引用super的问题。
正确实现方案
方案1:通过IBSegueAction跳转至SwiftUI视图
这是你最初想实现的跳转场景,步骤如下:
- 在你的主ViewController文件中(比如
MainViewController.swift),同时导入Cocoa和SwiftUI:
import Cocoa import SwiftUI
- 移除自定义的
hosty类,在主ViewController中添加segue处理方法:
class MainViewController: NSViewController { @IBSegueAction func showSwiftUIView(_ coder: NSCoder) -> NSViewController? { // 创建NSHostingController,传入你的SwiftUI根视图 return NSHostingController(coder: coder, rootView: ContentView()) } }
- 在Storyboard中完成关联:
- 拖一个
ViewController到画布,在Identity Inspector中设置它的Class为NSHostingController - 从源ViewController拖出segue到这个HostingController,设置segue标识符,再在segue的属性面板中,将
Segue Action关联到上面的showSwiftUIView方法
- 拖一个
方案2:直接在Storyboard中嵌入SwiftUI视图
如果不需要跳转,只是想在现有界面中嵌入SwiftUI内容:
- 拖一个
Custom View到ViewController画布,在Identity Inspector中设置它的Class为NSHostingView - 在ViewController代码中关联这个View并设置SwiftUI根视图:
class MainViewController: NSViewController { @IBOutlet weak var hostingView: NSHostingView! override func viewDidLoad() { super.viewDidLoad() hostingView.rootView = ContentView() } }
同样要确保导入了SwiftUI框架。
(不推荐)修复你原有代码的版本
如果你坚持要自定义NSHostingView子类(其实完全没必要),至少要修正基础问题:
import Cocoa import SwiftUI class Hosty: NSHostingView<ContentView> { // 除非有特殊绘制需求,否则不需要重写draw方法 }
内容的提问来源于stack exchange,提问作者Stratocasder
相关产品推荐
相关产品推荐

