如何从 OSX Swift 命令行工具或 shebang 脚本文件显示窗口?

Posted

技术标签:

【中文标题】如何从 OSX Swift 命令行工具或 shebang 脚本文件显示窗口?【英文标题】:How to present a window from an OSX Swift command line tool or shebang script file? 【发布时间】:2016-04-15 10:00:32 【问题描述】:

如何从 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 脚本中弹出信息窗口或请求窗口?

【问题讨论】:

一个解决方法是使用osascript 命令,但我想知道更好的答案。 @mouviciel 谢谢。难题是 Swift 是否已经足够平易近人,以至于(希望)osascript 和相关的AppleScriptJXA 对于带有一些 GUI 交互的 CLI/脚本来说并不是那么需要。 你有没有找到办法做到这一点?我一直在寻找拼图的一部分,但还没有开始工作。 @DanielWorthington 我添加了一个answer,说明我此时的发现和方法。 【参考方案1】:

我还没有找到问题提出的解决方案。设置窗口和处理用户界面事件并非易事。

Apple 在Open Scripting Architecture eXtensions (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 脚本。 See MCxSystemExecOsax on GitHub for details.

如果存在类似于 OSAX 的跨平台用户交互库,那将是非常有趣的。例如,可以使用Swift + Gnome Toolkit (GTK+) 实现这样的库。

【讨论】:

以上是关于如何从 OSX Swift 命令行工具或 shebang 脚本文件显示窗口?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode GM:OS X 命令行工具项目没有 swift 语言?

从 Swift 命令行程序中使用 NSURLSession

更新 OSX 命令行工具 6.3 后缺少 C++ 标头 <__debug>

无法使用 SQLite.swift 构建命令行项目

如何在OSX上解压缩omni.ja?

如何使用命令行工具向图像添加透明的 OS X 样式边框?