NSSavePanel 名称不是用户可编辑的
NSSavePanel name not user editable
我是 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 转换为路径。我有一些不明确的原因...)
所以这段代码大部分都有效:当我 运行 从终端 window 使用 swift guitest.swift
时,它会弹出一个文件选择器 window,让我 select一个pdf文件,然后弹出一个保存对话框让我选择目录,然后将pdf中提取的文本保存到该目录中。
但它不允许我更改文件名。我可以突出显示默认提供的 "Untitled.txt",我什至可以将光标移到该字段中……但它不响应键盘输入。
在此中,有人建议添加一个nameFieldStringValue
使其可编辑,但是,正如您从上面的代码中看到的那样,我这样做了,但它不起作用。
我从 this very old SO 了解到,至少在 Objective-C-land 中,您必须启动某种应用程序对象才能接受键盘输入。今天在 Swift-land 也是如此吗?
(即使出于某些奇怪的原因,您可以接受鼠标输入而无需执行任何操作?!)如果是这样,我该怎么做?
编辑:我从之前的评论中了解到,所以我链接到这可能是一个糟糕的想法,如果我想学习 Mac GUI 编程,我应该通过 XCode 和故事板以及所有其他内容。但是你能容忍我用这种愚蠢的方式尝试一次学习一件事吗? (即,学习所提供的 GUI API,而无需同时尝试学习 XCode 和 Apple 首选的架构风格。)
谢谢!
(Swift 4.2 在 OSX 的最新版本上。根本不使用 XCode。)
设置应用程序的 ActivationPolicy 将使其工作。
// Import statements... (import Quartz)
NSApplication.shared.setActivationPolicy(.accessory)
// Functions and so on... (func helper..)
我是 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 转换为路径。我有一些不明确的原因...)
所以这段代码大部分都有效:当我 运行 从终端 window 使用 swift guitest.swift
时,它会弹出一个文件选择器 window,让我 select一个pdf文件,然后弹出一个保存对话框让我选择目录,然后将pdf中提取的文本保存到该目录中。
但它不允许我更改文件名。我可以突出显示默认提供的 "Untitled.txt",我什至可以将光标移到该字段中……但它不响应键盘输入。
在此nameFieldStringValue
使其可编辑,但是,正如您从上面的代码中看到的那样,我这样做了,但它不起作用。
我从 this very old SO 了解到,至少在 Objective-C-land 中,您必须启动某种应用程序对象才能接受键盘输入。今天在 Swift-land 也是如此吗? (即使出于某些奇怪的原因,您可以接受鼠标输入而无需执行任何操作?!)如果是这样,我该怎么做?
编辑:我从之前的评论中了解到,所以我链接到这可能是一个糟糕的想法,如果我想学习 Mac GUI 编程,我应该通过 XCode 和故事板以及所有其他内容。但是你能容忍我用这种愚蠢的方式尝试一次学习一件事吗? (即,学习所提供的 GUI API,而无需同时尝试学习 XCode 和 Apple 首选的架构风格。)
谢谢!
(Swift 4.2 在 OSX 的最新版本上。根本不使用 XCode。)
设置应用程序的 ActivationPolicy 将使其工作。
// Import statements... (import Quartz)
NSApplication.shared.setActivationPolicy(.accessory)
// Functions and so on... (func helper..)