Приложение macOS, например Photos.app в macOS

Я пытаюсь создать приложение для macOS, например Photos.app. NSWindowController имеет панель инструментов с сегментированным элементом управления. Когда вы нажимаете на сегментированный элемент управления, он заменяет NSViewController на NSWindowController.

Пример Apple Photos.app.

Пока что у меня есть NSWindowController с NSViewController. У меня есть подкласс NSWindowController, где у меня есть метод, который вызывается всякий раз, когда пользователь нажимает на сегментированный элемент управления.

По сути, какой бы сегмент ни был нажат, он создаст экземпляр необходимого контроллера представления и установит его в свойство contentViewController NSWindowController.

введите здесь описание изображения

Это правильный способ сделать это?

Кроме того, я думаю, что NSWindowController должен иметь свойства для каждого из NSViewController, на которые он может переключаться, которые загружаются лениво (загружаются, когда пользователь нажимает на них, и они удерживаются для повторного использования, чтобы предотвратить повторную инициализацию).

Код:

import Cocoa

class MainWindowController: NSWindowController
{
    var secondaryViewController:NSViewController?

    override func windowDidLoad()
    {
        super.windowDidLoad()

        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
    }

    @IBAction func segmentedControlDidChange(_ sender: NSSegmentedControl)
    {
        print("Index: \(sender.selectedSegment)")

        if sender.selectedSegment == 3 {
            if secondaryViewController == nil {
                let viewController = storyboard?.instantiateController(withIdentifier: "SecondaryViewController") as! NSViewController
                secondaryViewController = viewController
            }

            self.window?.contentViewController = self.secondaryViewController
        }
    }
}

Я новичок в разработке для macOS, однако уже довольно давно занимаюсь iOS. Если есть лучший способ, я хотел бы знать об этом. Спасибо!!!


person Mario A Guzman    schedule 04.06.2017    source источник
comment
Вы также можете рассмотреть возможность использования NSTabViewController.   -  person jtbandes    schedule 04.06.2017
comment
@jtbandes Это правда, но я пытаюсь сохранить единый вид других приложений Apple для macOS, таких как «Фотографии», «Заметки» и «Карты». Мне нужно, чтобы сегментированный элемент управления оставался на панели инструментов вместе с другими элементами, такими как панели поиска и кнопки. Спасибо за ваш вклад!   -  person Mario A Guzman    schedule 04.06.2017
comment
NSTabViewController можно использовать без видимых вкладок, просто для обработки переключения между VC контента.   -  person jtbandes    schedule 04.06.2017


Ответы (1)


чтобы переместить вкладку/сегментированный элемент управления в заголовок, вам нужно:

  1. добавить панель инструментов в окно и добавить элементы управления на панель инструментов,
  2. скрыть заголовок:

    class TopLevelWindowController: NSWindowController {
    
      override func windowDidLoad() {
        super.windowDidLoad()
    
        if let window = window {
    
            // reminder like style
            // window.titlebarAppearsTransparent = true
            window.titleVisibility = .hidden
            // window.styleMask.insert(.fullSizeContentView)
        }
      }
    }
    
  3. теперь панель инструментов будет объединена с верхней панелью.

person hedzr    schedule 17.04.2018