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