Как установить пользовательский порядок вкладок в приложении Какао - PullRequest
0 голосов
/ 17 марта 2019

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

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

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

У меня есть группа 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 мог бы выполнять свои локальные вычисления, если это единственное представление.

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

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

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

...