Command line mac应用程序的Swift 3:如何在ViewController中将命令行输出显示(附加)到NSTextView?

Command line mac应用程序的Swift 3:如何在ViewController中将命令行输出显示(附加)到NSTextView?,command-line,swift3,append,nstextview,Command Line,Swift3,Append,Nstextview,在我的ViewController中,我有: @IBVAR ProgressView:NSTextView 我创建它是为了显示我想要运行的命令的所有输出 在单独的文件(类)中,我使用Process运行带有一些选项参数的命令行程序。我在下面引用了在这个stackoverflow中找到的一些其他答案,但试图对其进行安排,以便可以在主UI中输出执行结果 以下是我目前正在编辑的内容 类命令:进程{ var run=Process() func runCommand(cmd:String,args:[St

在我的ViewController中,我有:

@IBVAR ProgressView:NSTextView

我创建它是为了显示我想要运行的命令的所有输出

在单独的文件(类)中,我使用Process运行带有一些选项参数的命令行程序。我在下面引用了在这个stackoverflow中找到的一些其他答案,但试图对其进行安排,以便可以在主UI中输出执行结果

以下是我目前正在编辑的内容

类命令:进程{

var run=Process()

func runCommand(cmd:String,args:[String])->(输出:[String],错误:[String],出口代码:Int32){

返回(输出、错误、状态) }

如何将每个输出(行)发送到ViewController中的ProgressView

****编辑****

我今天已经完成了这方面的工作,并且取得了更大的进步。在学习了过去在stack overflow中的文章之后,我现在到达NotificationCenter创建从一个类到另一个类的路径,但还没有完全工作

在我的ViewController中: 重写func viewDidLoad(){ super.viewDidLoad()

NotificationCenter.default.addObserver(self,选择器:#选择器(appendToProgressView(通知:)),名称:NSNotification.name(rawValue:“append”),对象:nil) }

@IBVAR ProgressView:NSTextView

func appendToProgressView(通知:通知){ Logger.info(“收到通知”)

在我的另一个类中,Command: //这是它使用进程运行命令行任务的地方。我参考了一些有关堆栈溢出的信息,并根据需要进行了编辑

var run=Process()

在ViewController中,它最终做出响应,并将一些输出的文本附加到ViewController中的my NSTextView!中,但仅适用于errline大小写,这就是错误。由于某些原因,大纲不起作用


我想知道我遗漏了什么,并导致非错误案例无法附加到我的NSTextView!

问题是什么,如何从一个类获取数据到另一个类,或者如何将文本附加到文本视图?@Willeke Hi,感谢您的回复。这两者都是。(1)如何将在一个类中运行的每个终端输出发送给ViewController。(2)一旦ViewController获得该值,我如何将其附加到NSTextView?---我今天已经完成了这项工作,但还没有完成更新,它一直在崩溃,但我还不是很清楚。(@)当我的问题变得更好的时候,我可能会编辑我的问题。这些问题以前已经被问过了:和。我从你提到的链接中得到了一个附加文本,但是第一个,在ViewController之间传递数据和我想做的不太一样。我没有两个ViewController,一个只是运行进程的另一个类,我想o是要在NSTextView!中打印的实时输出,在我唯一的ViewController中链接和声明。我用今天的小进度更新了我的帖子。
var output: [String] = []
var error: [String] = []

run.launchPath = cmd
run.arguments = args

let outpipe = Pipe()
run.standardOutput = outpipe
let errpipe = Pipe()
run.standardError = errpipe
let outHandle = outpipe.fileHandleForReading

outHandle.readabilityHandler = { outpipe in

  if let line = String(data: outpipe.availableData, encoding: String.Encoding.utf8) {

    // Send output (line) to ProgressView in ViewController

  }
  else {
           // Error
  }
}
run.launch()
    if let outputMessage = notification.userInfo?["output"] as? String {
        Logger.info("outputMessage = \(outputMessage)")

        self.ProgressView.textStorage?.append(NSAttributedString(string: outputMessage))

    }
    else {

        let errMessage = notification.userInfo?["error"] as? String
        Logger.info("errMessage = \(errMessage)")

        self.ProgressView.textStorage?.append(NSAttributedString(string: errMessage!))
    }
    var output: [String] = []
    var error: [String] = []

    run.launchPath = cmd
    run.arguments = args

    let outpipe = Pipe()
    run.standardOutput = outpipe
    let errpipe = Pipe()
    run.standardError = errpipe

    let outHandle = outpipe.fileHandleForReading
    let errHandle = errpipe.fileHandleForReading

    outHandle.readabilityHandler = { outpipe in

        if let outline = String(data: outpipe.availableData, encoding: String.Encoding.utf8) {
            Logger.info("outline = \(outline)")

            let outDataDict: [String : String] = ["output" : outline]
            NotificationCenter.default.post(name: Notification.Name(rawValue: "append"), object: nil, userInfo: outDataDict)
        }
        else {
            // NEED MORE WORK
        }
    }

    errHandle.readabilityHandler = { errpipe in

        if let errline = String(data: errpipe.availableData, encoding: String.Encoding.utf8) {
            Logger.info("errline = \(errline)")

            let errDataDict: [String : String] = ["error" : errline]
            NotificationCenter.default.post(name: Notification.Name(rawValue: "append"), object: nil, userInfo: errDataDict)

        }
        else {
            // NEED MORE WORK
        }

    run.launch()
    ...

    run.waitUntilExit()

    ...