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

时间:2016-01-11 06:52:55

标签: swift macos shebang

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

理想情况下,不使用其他文件。没有故事板。没有xib。

一个例子是带有单个Swift文件的OS X Command Line Tools 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脚本中弹出信息窗口或请求窗口?

1 个答案:

答案 0 :(得分:0)

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

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的框架,该框架围绕许多Open Scripting Architecture eXtensions(OSAX)用户交互功能提供了一组Swift包装器。还包括一般运行的unix脚本。 See MCxSystemExecOsax on GitHub for details.

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