Имя NSSavePanel недоступно для редактирования пользователем - PullRequest
0 голосов
/ 25 января 2019

Я абсолютный новичок в программировании GUI для OSX, поэтому, пожалуйста, будьте осторожны со мной.

Я пытаюсь провести несколько экспериментов с добавлением легких элементов GUI из appkit в CLI, поэтому я работаю надочень маленькая программа, которая берет содержимое PDF и сохраняет его в текстовом файле.

Вот код, который у меня есть

import AppKit
import Foundation
import Quartz

func helperReadPDF(_ filename: String) -> String {
    let pdata = try! NSData(contentsOfFile: filename) as Data
    let pdf = PDFDocument(data: pdata)
    return pdf!.string!
}

func selectFile() -> URL? {
    let dialog = NSOpenPanel()
    dialog.allowedFileTypes = ["pdf"]
    guard dialog.runModal() == .OK else { return nil }
    return dialog.url
}


func getSaveLocation() -> URL? {
    let sa = NSSavePanel()
    sa.nameFieldStringValue = "Untitled.txt"
    sa.canCreateDirectories = true
    sa.allowedFileTypes = ["txt"]
    guard sa.runModal() == .OK else { return nil }
    return sa.url
}

let file = selectFile()?.path ?? ""

print("where to save?")

let dest = getSaveLocation()!

try! helperReadPDF(file).write(to: dest, atomically: true, encoding: .utf8)

(я знаю, что здесь много недиоматических вещей, таких как принудительное развертывание и бессмысленное преобразование URL-адресов в пути. У меня есть неясные причины...)

Таким образом, этот код в основном работает: когда я запускаю его из окна терминала с помощью swift guitest.swift, он открывает окно выбора файлов, позволяет мне выбрать файл PDF, а затем всплывающее окно сохраненияи позвольте мне выбрать каталог, а затем сохраните извлеченный текст из PDF-файла в этот каталог.

Но это не позволит мне изменить имя файла.Я могу выделить «Untitled.txt», предоставленный по умолчанию, я даже могу поместить курсор в поле ... но он не реагирует на ввод с клавиатуры.

В этом предыдущем SO кто-то предложил добавить nameFieldStringValue, чтобы сделать его редактируемым, но, как вы можете видеть из приведенного выше кода, я сделал это, и он не работает.

Я вижу из этого очень старого SO , что, по крайней мере в Objective-C-land, вы должны инициировать какой-то объект приложения, чтобы принимать ввод с клавиатуры.Это правда и сегодня на Свифт-ланде?(Несмотря на то, что по какой-то странной причине вы можете принять ввод с помощью мыши, ничего не делая ?!) Если да, то как мне здесь это сделать?

Редактировать: я получаю из комментариев к последнему предыдущему СО, что я связалчто это, вероятно, ужасная идея, и что если я хочу изучать программирование на графическом интерфейсе Mac, я должен сделать это тяжелым путем с XCode и раскадровками и всем остальным.Но не могли бы вы позволить мне делать это глупо, пытаясь научиться чему-то одному?(То есть, изучите предлагаемые API-интерфейсы GUI, не пытаясь одновременно изучить XCode и предпочтительный стиль архитектуры Apple.)

Спасибо!

(Swift 4.2 в последней версии OSX.Не использовать XCode вообще.)

1 Ответ

0 голосов
/ 25 января 2019

Настройка ActivationPolicy приложения заставит его работать.

// Import statements... (import Quartz)

NSApplication.shared.setActivationPolicy(.accessory)

// Functions and so on... (func helper..)
...