Как установить пользовательский порядок вкладок в приложении Cocoa

[MacOS Mojave 10.14.1, Xcode 10.1, Swift 4.2, приложение Cocoa]

Это мой первый проект Cocoa, в прошлом я немного занимался разработкой для iOS. Я потратил два дня, пытаясь сделать то и это, но безрезультатно. Я не могу поверить, насколько сложно заставить это работать на MacOS, учитывая, насколько это просто и эффективно в Visual Studio с Windows.

Итак, я создал прямолинейный проект приложения Cocoa, и Main.storyboard поставляется с:
1) NSApplication (меню),
2) NSWindowController, который находится над NSWindow,
3) NSWindow, который показывает «Контроллер представления» посередине,
4) NSViewController и
5) NSView (куда я поместил все свои объекты Cocoa).
(Стандарт из коробки)

У меня есть куча NSTextField, организованных внутри NSView, и я последовательно связал их nextKeyView выходов в нужном мне (петлевом) порядке. У меня есть другие элементы управления внутри NSView, но, поскольку я не хочу, чтобы они отображались на вкладках, я либо установил для их свойства Refuses First Responder значение ticked, либо для их Behaviour установил значение None. Я также пытаюсь исправить это программно и иметь в файле ViewController.swift по умолчанию (где находится весь мой код) цикл, который перебирает мои текстовые поля и устанавливает некоторые свойства текстового поля.

override func viewWillAppear() {
  for i in myTextFields {
    i.value.isEditable = true
    i.value.isEnabled = true
    i.value.alignment = NSTextAlignment.center
    //      i.value.refusesFirstResponder = true
    if i.key == FunctionsEnum.LSP {
      i.value.becomeFirstResponder()
    }
  }
}

(Где myTextFields — это словарь, отображающий FunctionsEnums справа NSTextField.)

Я также попытался пересчитать порядок, используя:

let appWindow = self.view.window
appWindow?.recalculateKeyViewLoop()

Но, к сожалению, это не имеет никакого эффекта. Я не понимаю, почему NSView (или NSViewController) не имеет метода recalculateKeyViewLoop(), поскольку он является контейнером для всех добавленных мной элементов управления. Да, NSWindow может потребоваться пересчитать количество представлений, но NSView может выполнить свои собственные локальные вычисления, если это единственное представление.

Я прочитал эти другие вопросы/ответы по этому вопросу:
Настройка пользовательского порядка вкладок в приложении Cocoa
https://www.stevestreeting.com/2014/02/11/auto-layout-and-tab-ordering/
Tab Order в конструкторе интерфейсов?
но ни один из предложенных советов или решений не работает для меня.

Может ли кто-нибудь помочь мне с этим?

Нужно ли мне создавать подкласс для NSWindowController или NSWindow? Я положил вещи в неправильный контейнер? Нужно ли делегирование между NSViewController/NSView (ViewController.swift) чем-то еще? У меня отсутствует какой-то другой необходимый код? Нужно ли вызывать некоторые протоколы, которые я пропустил?


person gone    schedule 17.03.2019    source источник
comment
если вы хотите установить новый ключевой респондент: вызовите makefirstresponder в своем окне с желаемым новым респондентом. Если у вас есть окно в XIB/Storyboard, вы можете включить там recalculateviewloop (лучше всего для просмотра таблиц). Также посмотрите на свойство с именем initialFirstResponder. Вы можете пересчитать цикл просмотра вручную в любом месте, например, в nsviewcontroller (это просто настройка nextKeyViews). Пересчитывать, только если вы меняете представления динамически   -  person Marek H    schedule 17.03.2019
comment
Возможный дубликат Cocoa: NextKeyView - Порядок вкладок   -  person Willeke    schedule 17.03.2019