Приложение Swift Ma c Os - NSSavePanel не работает правильно с приложением «только фон» - PullRequest
1 голос
/ 11 февраля 2020

Я разрабатываю быстрое ОС Ma c, которое работает только в строке состояния (с всплывающим окном) с Application is background only, установленным на true.

Внутри всплывающего окна пользователь может взаимодействовать с кнопкой для сохранения изображения, более конкретно, запускается следующая функция:

@IBAction func saveImage(sender: NSButton) {
    self.closePopover()

    let dialog = NSSavePanel()

    let date = Date()
    let formattedDate = getFormattedDate(date: date, format: "yyyy-MM-dd")
    let formattedTime = getFormattedDate(date: date, format: "HH.mm.ss")
    dialog.level = .modalPanel
    dialog.title                    = "Choose a destination"
    dialog.nameFieldStringValue     = "Screenshot \(formattedDate) at \(formattedTime)"
    dialog.showsResizeIndicator     = true
    dialog.showsHiddenFiles         = false
    dialog.canCreateDirectories     = true
    dialog.allowedFileTypes         = ["png"]

    if (dialog.runModal() == .OK) {
        // Pathname of the file
        if let result = dialog.url {
            self.screenshot!.savePNGRepresentationToURL(url: result)
        }
    } else {
        // User clicked on "Cancel"
        return
    }
}

Проблема в том, что:

  • Если я поставлю Application is background only = true:
    Я не могу взаимодействовать с NSSavePanel (не могу изменить поле save as), и если я пишу внутри этого поля, текст пишется в последнем приложении, с которым я взаимодействовал (фокус на самом деле не модальный) ).
  • Если я поставлю Application is background only = false:
    , NSSavePanel работает отлично, но это не очень хорошее решение, потому что я не хочу, чтобы значок отображался в доке

Таким образом, проблема явно связана с Application is background only, но я не нашел способа, чтобы оба:

  • не отображали значок приложения в доке
  • хорошее взаимодействие с NSSavePanel

1 Ответ

0 голосов
/ 12 февраля 2020

Я решил использовать метод NSApplication.shared.setActivationPolicy, например:

@IBAction func saveImage(sender: NSButton) {
    self.closePopover()

    NSApplication.shared.setActivationPolicy(.regular)

    let dialog = NSSavePanel()

    let date = Date()
    let formattedDate = getFormattedDate(date: date, format: "yyyy-MM-dd")
    let formattedTime = getFormattedDate(date: date, format: "HH.mm.ss")
    dialog.level = .modalPanel
    dialog.title                    = "Choose a destination"
    dialog.nameFieldStringValue     = "Screenshot \(formattedDate) at \(formattedTime)"
    dialog.showsResizeIndicator     = true
    dialog.showsHiddenFiles         = false
    dialog.canCreateDirectories     = true
    dialog.allowedFileTypes         = ["png"]

    if (dialog.runModal() == .OK) {
        // Pathname of the file
        if let result = dialog.url {
            self.screenshot!.savePNGRepresentationToURL(url: result)
        }
    } else {
        // User clicked on "Cancel"
    }

    NSApplication.shared.setActivationPolicy(.accessory)
}
...