在基于故事板的AppKit应用中,使用 @IBSegueAction配合NSSplitViewController

移动开发 2026-07-09

我有一个基于故事板的AppKit应用,正在尝试通过以下任一方式将依赖注入到一个 NSSplitViewController 及其子 NSViewController 中:

  • @IBSegueAction
  • instantiateInitialController(creator:)

层级关系是:

NSWindowController
└── NSSplitViewController
    ├── SidebarViewController
    └── DetailViewController

我按如下方式添加了自定义初始化器:

init?(coder: NSCoder, dependency: Dependency) {
    self.dependency = dependency
    super.init(coder: coder)
}

并有意将默认的init(coder:) 初始化器设为不可用:

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

然而,AppKit仍然调用:

required init?(coder: NSCoder)

而不是我的自定义初始化器。

我尝试了:

  • NSWindowController 中添加 @IBSegueAction 方法
  • NSSplitViewController 中添加 @IBSegueAction 方法
  • 将relationship segue逐个连接到各自的拥有者

但都没有改变行为。

示例:

@IBSegueAction
func makeSplitViewController(_ coder: NSCoder) -> NSSplitViewController? {
    SplitViewController(coder: coder, dependency: dependency)
}

问题:

  1. @IBSegueAction 能否用于涉及 NSWindowControllerNSSplitViewController 的关系跳转?
  2. 它能否用于 NSSplitViewController 的子视图控制器?
  3. instantiateInitialController(creator:) 在AppKit的基于故事板的 NSSplitViewController 层级中能否正确工作?
  4. 是否有针对使用分屏控制器的基于故事板的AppKit应用的推荐依赖注入模式?

我在此特指AppKit的行为,而非UIKit。

解决方案

在我的测试应用中,init?(coder: NSCoder) 的调用顺序如下:

SidebarViewController
DetailViewController
MyWindowController
SplitViewController

SidebarViewControllerDetailViewController 不能由 MyWindowControllerSplitViewController 创建,因为它们还不存在。

@IBSegueAction 也不起作用,因为它是在呈现视图控制器上被调用,而关系跳转不会呈现。嵌入型(embed)segue显然会呈现,并且支持 @IBSegueAction

层级结构:

NSWindowController
└── ContainerViewController
    └── Container View
        └── NSSplitViewController
            ├── SidebarViewController
            └── DetailViewController

ContainerViewControllerNSViewController 的子类,并实现 makeSplitViewControllermakeSidebarControllermakeDetailController。它的视图包含一个容器视图(Container View),该视图跳转到 NSSplitViewController。这些segue的选择器已连接到 ContainerViewController

这与 How to use @IBSegueAction with UITabBarController? 的解决方案相同。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章