如何从 OSX Swift 命令行工具或 shebang 脚本文件呈现窗口?
理想情况下,不使用其他文件。没有故事板。没有 xib。
一个例子是带有单个 Swift 文件的 OS X 命令行工具 Xcode 项目。
import Cocoa // AppKit, CoreData, Foundation
let arguments = Process.arguments
if (arguments.contains("usegui")) {
// show arguments in a window with text field and dismiss button
// GIVEN: some NSWindow
let aTextField = NSTextField(frame: NSMakeRect(25, 320, 180, 24))
aTextField.stringValue = arguments.description
let mask = NSTitledWindowMask | NSClosableWindowMask
let aWindow = NSWindow(
contentRect: NSMakeRect(0, 0, 400, 210),
styleMask: mask,
backing: NSBackingStoreType.Buffered,
`defer`: false)
aWindow.contentView!.addSubview(aTextField)
// add button ...
/* How to
* (a) present the window?
* (b) have window dismissed by user?
*/
} else {
print("Using text IO here.")
print(arguments)
}
另一个例子是 shebang Swift 脚本。
#!/usr/bin/swift
import Cocoa // AppKit, CoreData, Foundation
let arguments = Process.arguments
if (arguments.contains("usegui")) {
// popup window showing arguments here
} else {
print(arguments)
}
背景:应用程序上下文中存在大量 swift 窗口示例。 而且,许多使用文本 I/O 的 Swift REPL 示例。
有没有一种合理的方法可以从 swift CLI 工具或 swift 脚本弹出信息窗口或请求窗口?
我还没有找到问题所描述的解决方案。设置窗口和处理用户界面事件并非易事。
Apple 在开放脚本架构扩展 (OSAX( 中提供了一组常见的用户交互(例如对话框和警报(。 Swift 可以使用Process()
调用 OSAX 例程,并将launchPath
设置为 "/usr/bin/osascript"。
let process = Process()
process.launchPath = "/usr/bin/osascript"
process.arguments = args // Applescript
// ... more code here ...
因此,我最终创建了一个名为 MCxSystemExecOsax
的框架,它围绕许多开放脚本架构扩展 (OSAX( 用户交互功能提供了一组 Swift 包装器。还包括一个通用的运行 unix 脚本。有关详细信息,请参阅 GitHub 上的MCxSystemExecOsax
。
如果存在类似于OSAX的跨平台用户交互库,那将非常有趣。例如,这样的库可能会使用 Swift + Gnome Toolkit (GTK+( 来实现。