描述
我正在尝试使用NSSegmentedControls
子 ViewControllers 之间的转换。ParentViewController
位于Main.storyboard
和ChildViewControllers
位于Assistant.storyboard
。_ 每个 ChildViewController 都有一个 SegmentedControl,分为 2 个 Segment,它们的主要用途是在 ChildViewController 之间导航。因此它们被设置为momentaryPushIn
而不是 selectOne。每个 ChildViewController 使用一个Delegate与 ParentViewController 进行通信。
所以在 ParentViewController 我添加了 ChildViewControllers 如下:
/// The View of the ParentViewController configured as NSVisualEffectView
@IBOutlet var visualEffectView: NSVisualEffectView!
var assistantChilds: [NSViewController] {
get { return [NSViewController]() }
set(newValue) {
for child in newValue { self.addChild(child) }
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
addAssistantViewControllersToChildrenArray()
}
override func viewWillAppear() {
visualEffectView.addSubview(self.children[0].view)
self.children[0].view.frame = self.view.bounds
}
private func addAssistantViewControllersToChildrenArray() -> Void {
let storyboard = NSStoryboard.init(name: "Assistant", bundle: nil)
let exampleChild = storyboard.instantiateController(withIdentifier: "ExampleChild") as! ExampleChildViewController
let exampleSibling = storyboard.instantiateController(withIdentifier: "ExampleSibling") as! ExampleSiblingViewController
exampleChild.navigationDelegate = self
exampleSibling.navigationDelegate = self
assistantChilds = [exampleChild, exampleSibling]
}
到目前为止,一切都很好。有ExampleChildViewController
一个NSTextField
实例。当我在 TextField 的范围内时,我可以触发 SegmentedControls 的操作。它应该向前和向后导航。但是一旦我离开 TextField 的范围,我仍然可以单击 Segments,但它们不会触发任何操作。即使 TextField 不是应用程序的当前“第一响应者”,它们也应该能够向前和向后导航。我想我在这里遗漏了一些东西,我希望任何人都可以帮助我。我知道问题不是NSSegmentedControl
因为我NSButton
在 SiblingViewController 中看到配置为 Switch/Checkbox 的相同行为。我只是不知道我做错了什么。
这是我第一次在这里自己提出问题,所以我希望我的做法能够很好地解决问题。让我知道我是否可以做得更好/不同,或者我是否需要提供有关某事的更多信息。
提前致谢!
附加信息
为了完整起见:
ParentViewController
本身嵌入在 a中,由ContainerView
拥有RootViewController
。我无法想象这有什么关系,但这样我们就不会错过任何东西。
我实际上并没有显示导航操作,因为我想让它尽可能简单。此外,这个动作没有问题,它做我想做的事。如果我对此有误,请纠正我。
我在研究时发现的可能解决方案,但对我不起作用:
- 将 ChildViewControllers 的 window.delegate 设置为 NSApp.windows.first?.delegate
- 将 ChildViewController 设置
becomeFirstResponder
为func viewWillAppear()
visualEffectView.addSubview(self.children[0].view, positioned: NSWindow.OrderingMode.above, relativeTo: nil
)
我在研究时发现的相关问题/主题: