Storyboard报错:Unrecognized selector发送至ViewController实例问题
问题分析与解决方案
核心问题
你混淆了**视图控制器(ViewController)和视图(View)**的角色:
- Storyboard中,名为
ViewController的对象本质是视图控制器(NSViewController/UIViewController的子类),系统会自动调用视图控制器特有的方法(比如_setIsContentViewController:)来管理它的生命周期和界面层级。 - 但你让
ViewController继承自OGView(MTKView的子类,属于视图类),导致系统试图给一个“视图对象”调用只有视图控制器才有的方法,而视图类根本没有实现这些方法,因此抛出无法识别选择器的错误。
修复步骤
1. 还原ViewController的继承关系
让ViewController回归视图控制器的角色,继承自NSViewController(macOS)或UIViewController(iOS):
修改后的 OrionApp/ViewController.swift
// // ViewController.swift // OrionApp // // Created by Fildom on 27.10.2022. // import Cocoa // macOS环境用这个,iOS环境替换为UIKit import OrionGraphics class ViewController: NSViewController { // 关联Storyboard中的OGView @IBOutlet weak var ogView: OGView! override func viewDidLoad() { super.viewDidLoad() print("ViewController loaded") // 可在这里对ogView进行额外配置 } }
2. 修正Storyboard关联
- 确认Storyboard中,
ViewController的Class设置为ViewController,Module设置为OrionApp - 确认Storyboard中,视图层级里的View(也就是你的Metal视图)的Class设置为
OGView,Module设置为OrionGraphics - 在Storyboard中,按住
control键从ViewController拖拽到OGView,建立IBOutlet关联,命名为ogView(对应代码中的属性)
3. 保留OGView框架代码
你的OrionGraphics框架代码(OGView.swift、OGRenderer.swift、Shaders.metal)无需修改,它们作为独立的视图组件可以正常工作。
原始错误信息
2022-10-27 18:54:05.851069+0200 OrionApp[5893:191390] [Nib加载] 无法连接( storyboard )输出口从(OrionApp.ViewController)到(NSStoryboard):缺少setter或实例变量 2022-10-27 18:54:05.851705+0200 OrionApp[5893:191390] -[OrionApp.ViewController _setIsContentViewController:]: 无法识别的选择器发送至实例0x7fa98c020a00 2022-10-27 18:54:05.858096+0200 OrionApp[5893:191390] 无法在(NSWindow)上设置(contentViewController)用户定义的检查属性:-[OrionApp.ViewController _setIsContentViewController:]: 无法识别的选择器发送至实例0x7fa98c020a00
内容的提问来源于stack exchange,提问作者Fildom
相关产品推荐
相关产品推荐

