[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) чем-то еще? У меня отсутствует какой-то другой необходимый код? Нужно ли вызывать некоторые протоколы, которые я пропустил?