NSSavePanel名称不可用户编辑

时间:2019-01-25 00:18:33

标签: swift macos cocoa appkit nssavepanel

我是OSX GUI编程的初学者,所以请对我保持温柔。

我正在尝试将appkit的简单GUI元素添加到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”,甚至可以将光标移到该字段中...但是它不响应键盘输入。

在此previous SO中,有人建议添加一个nameFieldStringValue以使其可编辑,但是,正如从上面的代码中可以看到的那样,我做到了,但是不起作用。

我从this very old SO看到,至少在Objective-C地区,您必须启动某种应用程序对象才能接受键盘输入。今天在斯威夫特州也是如此吗?  (即使出于某些奇怪的原因,您也可以不做任何操作就接受鼠标输入?!)如果是这样,我该怎么做?

编辑:我从评论到最后的上一个SO,所以我认为这可能是一个糟糕的主意,如果我想学习Mac GUI编程,则应该使用XCode和Storyboard以及其他所有方法来进行繁重的工作。 。但是,您能以一种愚蠢的方式让我沉迷于尝试一次学习一件事的努力吗? (即,在不同时尝试学习XCode和Apple首选的体系结构的情况下,学习提供的GUI API。)

谢谢!

(在最新版本的OSX上为Swift 4.2。完全不使用XCode。)

1 个答案:

答案 0 :(得分:1)

设置应用程序的ActivationPolicy将使其正常工作。

// Import statements... (import Quartz)

NSApplication.shared.setActivationPolicy(.accessory)

// Functions and so on... (func helper..)
相关问题