NSSplitViewController не разрушается при создании из раскадровки

Я пытаюсь имитировать поведение таких приложений, как "Заметки" и "Контакты", где при изменении размера окна левый элемент разделенного вида разрушается. Я не могу воссоздать это поведение при использовании раскадровки.

Если я создаю NSSplitViewController в коде, это работает нормально, однако, если я делаю это через раскадровку, это не работает.

Я создал урезанный проект, единственное отличие которого заключается в том, как создается экземпляр NSSplitViewController:

https://github.com/peteog/NSSplitViewControllerIssue

Посмотрите строки 11 и 12 MainWindowController, если вы переключите комментарии, а затем запустите пример приложения, вы увидите разницу в поведении:

import Cocoa

class MainWindowController: NSWindowController {
    override var windowNibName: NSNib.Name? {
        return "MainWindowController"
    }

    override func windowDidLoad() {
        super.windowDidLoad()

//        let splitViewController = NSSplitViewController()
        let splitViewController = NSStoryboard(name: "Storyboard", bundle: nil).instantiateInitialController() as! NSSplitViewController

        let sidebarSplitViewItem = NSSplitViewItem(sidebarWithViewController: SidebarViewController())
        splitViewController.addSplitViewItem(sidebarSplitViewItem)

        let contentSplitViewItem = NSSplitViewItem(viewController: ContentViewController())
        splitViewController.addSplitViewItem(contentSplitViewItem)

        contentViewController = splitViewController
    }    
}

Я не могу сказать, является ли это ошибкой или есть свойство, которое мне не хватает в NSSplitViewController, когда он исходит из раскадровки, чтобы заставить работать поведение свертывания.

Код:

Раскадровка:

1 ответ

(Отвечая на свой вопрос)

Я получил от Apple отзыв о радаре, который я подал для этого. Я могу подтвердить, что проблема исправлена ​​в macOS Catalina beta 5.

В вашем проекте не определен разделенный вид. Когда вы делаете это в коде, вы определяете приоритет удержания, устанавливая поведение разделения представления в качестве боковой панели. Это можно сделать и в конструкторе интерфейсов, если вы не удалили сами разделенные виды из конструктора интерфейсов. Однако свертывание боковой панели должно быть сделано в коде. Глядя на приложение контактов, я считаю, что они отслеживают размер окна и сворачивают боковую панель, когда она достигает жестко заданного размера.

Другие вопросы по тегам