在 Swift 的 NSScrollView 和 NSTextView 中显示控制台输出

Posted

技术标签:

【中文标题】在 Swift 的 NSScrollView 和 NSTextView 中显示控制台输出【英文标题】:Show console output in NSScrollView and NSTextView in Swift 【发布时间】:2015-03-27 18:47:02 【问题描述】:

过去几天我一直在学习 Swift,我似乎遇到了困难。

我正在尝试创建一个ViewController 窗口,其中有一个按钮和一个NSViewText。当我按下按钮时,应用程序会向用户提示带有NSTextField 的工作表。按下回车后,NSTextField 字符串保存在变量中,工作表关闭,并执行终端命令。

现在,我在AppDelegate 中的执行命令方法创建了一个带有NSPipe 的管道:

let cmd = NSTask()
...
let pipe = NSPipe()
cmd.standardOutput = pipe
cmd.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = NSString(data: data, encoding: NSUTF8StringEncoding)!

var consoleOutput = output
return output

consoleOutput 在执行方法之外,所以我尝试在ViewController 中显示它,如下所示:

编辑:更改了之前的代码,但仍然出现错误:

textView.string = myDelegate.consoleOutput

我希望终端输出实时显示在NSViewText(或NSTextField,或NSScrollViewNSClipView?不确定哪个)中。我不能做的是找到一种方法来操纵NSTextView 的内容,因为当我运行它时,我收到以下错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

如果分配闭包(例如代码块)完全可行,则必须将其放在声明中的“=”之后,而不是 LHS 上的 : 之后。您基本上是在尝试将类型声明为静态代码块。我很惊讶编译器可以让你摆脱那些只抱怨 IBOutlet 方面本身的问题。

【讨论】:

啊!所以我们不能像使用IBAction一样使用IBOutlet!知道了。但是现在当我将其更改为@IBOutlet var textView: NSTextView! 并使用textView.string = myDelegate.consoleOutput 时,我得到fatal error: unexpectedly found nil while unwrapping an Optional value 完全不同。 IBOutlet 只是一个标签,它告诉 Interface Builder 和环境它是一个变量,用于在为您的视图控制器加载情节提要或 nib(例如 .xib)时接收对情节提要或 nib 中定义的对象的引用。 IBAction 是一个标记,表明它是一个已设置为通过 Interface Builder 工具调用的事件处理函数。 IBOutlet 位于声明部分且不可执行,仅 IBAction 前缀函数。

以上是关于在 Swift 的 NSScrollView 和 NSTextView 中显示控制台输出的主要内容,如果未能解决你的问题,请参考以下文章

NSScrollview 不以编程方式滚动?

与 NSViewRepresentable 托管的 NSScrollView 绑定的问题

NSScrollView 滚动后在 Xcode 5 中显示问题

NSScrollView 内容大小不正确

NSScrollView 混乱

NSCollectionView+NSScrollView 中的鼠标悬停