windowWillClose и действие кнопки не вызывается Swift

Я разрабатываю приложение для Mac с Xcode 10 (бета-версия), и у меня возникла проблема с контроллером окна настроек.

У меня в Main.storyboard есть NSWindowController пользовательского класса PreferenceWindowController с панелью инструментов. Вот его соединения: все соединения NSWindowController

Вот полный класс:

class PreferenceWindowController: NSWindowController, NSWindowDelegate {

@IBAction func didClickAuthor(_ sender: Any) {
    print("author")
}

@IBAction func didClickTypo(_ sender: Any) {
    print("typo")
}

override func windowDidLoad() {
    super.windowDidLoad()
}

func windowWillClose(_ notification: Notification) {
    print("willClose")
}
}

Окно запускается через класс AppDelegate с помощью этого кода:

let storyboard = NSStoryboard(name: "Main",bundle: nil)

    if let wc = storyboard.instantiateController(withIdentifier: "PreferenceWindowController") as? PreferenceWindowController
    {
        wc.showWindow(self)
    }

Окно открывается как положено, с кликабельной панелью инструментов, но никакие функции из PreferenceWindowController не вызываются вообще, ни закрытие окна, ни клики по панели инструментов.

Я проверил каждое соединение, каждое имя класса, и я действительно не знаю, что не так...

РЕШЕНИЕ

Решение состоит в том, чтобы сохранить класс PreferenceViewController внутри класса AppDelegate в качестве переменной.

Мое решение:

var preferenceWindowController:PreferenceWindowController? = nil

@IBAction func clickPreferences(_ sender: Any) {
    if let wc = storyboard.instantiateController(withIdentifier: "PreferencesWindowController") as? PreferenceWindowController {
        let window = wc.window
        preferenceWindowController = wc

        wc.showWindow(self)
    }
}

Спасибо за помощь !


person Onoulade    schedule 10.07.2018    source источник
comment
Освобожден ли wc из-за отсутствия строгой ссылки?   -  person Willeke    schedule 10.07.2018
comment
Как я могу сделать сильную ссылку на PreferenceViewController в AppDelegate?   -  person Onoulade    schedule 10.07.2018


Ответы (1)


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

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

person Mattie    schedule 10.07.2018