繁体   English   中英

NSSavePanel 名称不是用户可编辑的

[英]NSSavePanel name not user editable

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

我正在尝试将轻量级 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 领域,您必须启动某种应用程序对象才能接受键盘输入。 今天在 Swift-land 也是如此吗? (即使出于某种奇怪的原因,您可以在不执行任何操作的情况下接受鼠标输入?!)如果是这样,我该怎么做?

编辑:我从评论到最后一个之前所以我链接到这可能是一个糟糕的想法,如果我想学习 Mac GUI 编程,我应该用 XCode 和故事板以及所有其他方法来做。 但是你能不能放纵我以一种愚蠢的方式努力尝试一次学习一件事? (即,学习提供的 GUI API,而不必同时尝试学习 XCode 和 Apple 的首选架构风格。)

谢谢!

(最新版本的 OSX 上的 Swift 4.2。根本不使用 XCode。)

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

// Import statements... (import Quartz)

NSApplication.shared.setActivationPolicy(.accessory)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM