Раскалывание OSX - Открытое немодальное окно со стандартным отступлением

Я пытаюсь показать NSViewController через segue раскадровки (OSX). В открывшемся окне будет окно инспектора, поэтому оно должно быть немодальным.

Когда я создаю действие segue с помощью Ctrl-перетаскивания с кнопки триггера на контроллер окна, мне предлагаются следующие параметры стиля segue:

  • Модальные
  • лист
  • поповер
  • Пользовательские

Первые три варианта явно не подходят.

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

Однако, поскольку мое требование кажется мне довольно простым, мне интересно, не хватает ли я чего-то очевидный, простой способ открыть немодальное окно через холст.

Я использую XCode6-Beta3.

Ответ 1

По крайней мере, сейчас (Beta3), немодальное представление должно иметь свое собственное окно, и нет простого способа создать для него такой сегмент.

Вместо этого перетащите новый объект Window Controller на свою раскадровку. Он будет поставляться со своим собственным представлением контента как "Отслеживание отношений". Тем не менее, если для окна требуется другое представление (например: контроллер представления таблиц), просто удалите новый контроллер View и перетащите элемент управления с помощью нового контроллера окон на контроллер просмотра, представление которого вы хотите использовать для содержимого окна.

Важно: Выберите объект Window Controller в Storyboard и в Identity Inspector, установите идентификатор раскадровки в строку, которая будет идентифицировать это окно (например: "Inspector" ).

Затем просто напишите небольшой код, чтобы показать окно:

var inspectorController: NSWindowController?
@IBAction func showInspector(sender : AnyObject) {
    if !inspectorController {
        let storyboard = NSStoryboard(name: "Main", bundle: nil)
        inspectorController = storyboard.instantiateControllerWithIdentifier
           ("Inspector") as? NSWindowController
    }
    if inspectorController { inspectorController!.showWindow(sender) }
}

Я действительно счел предпочтительным not использовать основную раскадровку для любых окон вообще. Одна из причин заключается в том, что с помощью раскадровки (по крайней мере, прямо сейчас) нет способа перехвата начального сеанса при запуске приложения, а windowWillLoad никогда не вызывается в главном окне контроллера.

Вместо этого создайте отдельные раскадровки для окон приложения и/или документа и используйте класс AppDelegate для их создания. Дополнительная информация и рабочий пример в этом потоке.