在基于故事板的AppKit应用中,使用 @IBSegueAction配合NSSplitViewController
我有一个基于故事板的AppKit应用,正在尝试通过以下任一方式将依赖注入到一个 NSSplitViewController 及其子 NSViewController 中:
@IBSegueActioninstantiateInitialController(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)
}
问题:
@IBSegueAction能否用于涉及NSWindowController→NSSplitViewController的关系跳转?- 它能否用于
NSSplitViewController的子视图控制器? instantiateInitialController(creator:)在AppKit的基于故事板的NSSplitViewController层级中能否正确工作?- 是否有针对使用分屏控制器的基于故事板的AppKit应用的推荐依赖注入模式?
我在此特指AppKit的行为,而非UIKit。
解决方案
在我的测试应用中,init?(coder: NSCoder) 的调用顺序如下:
SidebarViewController
DetailViewController
MyWindowController
SplitViewController
SidebarViewController 和 DetailViewController 不能由 MyWindowController 或 SplitViewController 创建,因为它们还不存在。
@IBSegueAction 也不起作用,因为它是在呈现视图控制器上被调用,而关系跳转不会呈现。嵌入型(embed)segue显然会呈现,并且支持 @IBSegueAction。
层级结构:
NSWindowController
└── ContainerViewController
└── Container View
└── NSSplitViewController
├── SidebarViewController
└── DetailViewController
ContainerViewController 是 NSViewController 的子类,并实现 makeSplitViewController、makeSidebarController 和 makeDetailController。它的视图包含一个容器视图(Container View),该视图跳转到 NSSplitViewController。这些segue的选择器已连接到 ContainerViewController。
这与 How to use @IBSegueAction with UITabBarController? 的解决方案相同。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。