修改 Swift 中 NSTextField 的 stringValue

Modify stringValue of NSTextField in Swift

我试图通过更改来自 AppDelegatestringValue 来更改 ViewControllerNSTextField 的内容,但它给了我一个错误。

AppDelegate中的代码是:

class AppDelegate: NSObject, NSApplicationDelegate {

    var consoleOutput:String? = "Console Output"

    func executeCommand(command: String, args: [String]) -> String {

        let task = NSTask()
        task.launchPath = command
        task.arguments = args

        let pipe = NSPipe()
        task.standardOutput = pipe
        task.launch()

        let data = pipe.fileHandleForReading.readDataToEndOfFile()
        let output:String = NSString(data: data, encoding: NSUTF8StringEncoding)!
        consoleOutput = output
        return output
    }
}

它是从 ViewController:

调用的
var myDelegate = NSApplication.sharedApplication().delegate! as AppDelegate

NSTextField 是之前创建的 IBOutlet:

@IBOutlet weak var outputText: NSTextField!

稍后尝试修改:

outputText.stringValue = myDelegate.consoleOutput!

但我得到的只是

fatal error: unexpectedly found nil while unwrapping an Optional value

我做错了什么?

consoleOuput 被声明为可选 (?),并且可能包含 nil。尽管如此,您还是强制展开它 (!) 而不是检查 nil。这就是你"fatal error"的原因。任何时候你强行打开一个可选的,你都有这个错误的风险。

你可以试试这样的东西:

outputText.stringValue = myDelegate.consoleOutput ?? ""

这将尝试解包 myDelegate.consoleOutput,但如果它不能(因为它是 nil),它只会将空字符串分配给 outputText.stringValue.

?? 被称为 "Nil Coalescing Operator"。

尝试将此行:let output:String = NSString(data: data, encoding: NSUTF8StringEncoding)!设置为:let output: String = "Test" 如果这消除了错误,那么您知道 NSString(data: data, encoding: NSUTF8StringEncoding) 正在返回 nil,因此数据管道有问题。