Command line mac应用程序的Swift 3:如何在ViewController中将命令行输出显示(附加)到NSTextView?
在我的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大小写,这就是错误。由于某些原因,大纲不起作用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
我想知道我遗漏了什么,并导致非错误案例无法附加到我的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()
...