设置:
我正在编写一个基于文档的应用程序,目标是使用故事板的OS X 10.11。主窗口有一个带3段的NSToolbar单击分段控件时,它应在水平或垂直NSSegmentedControl中切换NSSplitViewItem的折叠状态。我试图实现的行为与Xcode7中的行为相同,在Xcode7中,工具栏中的分段控件显示/隐藏导航器/调试区域/实用程序视图。
当前,分段控件向第一响应者发送一个操作。action方法由一个子类实现,然后切换到它的折叠状态。
问题是:
问题是工具栏还包含一个NSSplitView。如果NSSplitViewController有焦点,或者即使分段的控件本身有焦点,使用光标单击NSSplitViewItem也不会导致操作方法正确地使响应链向上到达NSSearchField子类。
尝试的解决方案:
以前,我使用通知而不是目标/操作来解决这个问题,但最终它太复杂了。另一个想法是将消息发送给窗口控制器,然后窗口控制器将消息传递给其内容视图控制器,内容视图控制器将消息传递给垂直拆分视图控制器,然后垂直拆分视图控制器将消息(如果需要)发送给水平拆分视图控制器。虽然我知道这是可行的,但它似乎也是一个丑陋的解决方案,必须将代码添加到另外两个只传递消息的文件中,我认为这是使用响应器链所避免的。
任何见解都会非常感谢。
最终解决方案:
我意识到将分段控件的操作连接到第一个响应程序只有在键视图上下文很重要时才有意义。在这种情况下,不管关键视图是什么,分段控件都应该在多个嵌套的拆分视图中切换拆分视图项的折叠状态。
定义枚举以表示拆分视图的区域:

enum SplitViewArea : Int {
    // The raw values must match the order of the segmented control
    case left, top, right
}

定义一个协议,以通知应切换拆分视图区域:
protocol SplitViewTogglable {
    func toggleSplitViewItem(matching area: SplitViewArea)
}

在窗口控制器中实现分段控制动作方法:
@IBAction func segmentedControlSelectionStateDidChange(_ sender: Any) {
    guard let segmentedControl = sender as? NSSegmentedControl else { return }
    guard let area = SplitViewArea(rawValue: segmentedControl.selectedSegment) else { return }
    guard let togglable = contentViewController as? SplitViewTogglable else { return }
    togglable.toggleSplitViewItem(matching: area)
}

在nssplitViewController子类中实现NSSearchField协议的方法:
func toggleSplitViewItem(matching area: SplitViewArea) {
    switch area {
    case .left:
        leftSplitViewItem.isCollapsed = !leftSplitViewItem.isCollapsed
    case .top:
        // Nested NSSplitViewController that adopts SplitViewTogglable
        if let togglable = centerSplitViewItem.viewController as? SplitViewTogglable {
            togglable.toggleSplitViewItem(matching: area)
        }
    case .right:
        rightSplitViewItem.isCollapsed = !rightSplitViewItem.isCollapsed
    }
}

最佳答案

是否将NSSplitViewController设置为窗口的contentViewController
作为响应程序链搜索动作目标的一部分,如果窗口响应动作选择器,它会将其contentViewController视为补充目标。
当搜索字段具有键焦点时,响应器链不会经过常规内容区域,而是通过工具栏进入窗口。因此,nssplitviewcontroller可以成为搜索的一部分的唯一方法就是使用contentViewController

关于swift - NSSTField和NSSegmentedControl在NSToolbar中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34754374/

10-12 05:39