修改Swift中NSTextField的stringValue

时间:2015-03-27 22:51:44

标签: macos swift nstextfield nspipe

我正在尝试通过更改来自NSTextField的{​​{1}}来更改ViewControllerstringValue的内容,但它会给我一个错误。

AppDelegate中的代码是:

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!

但我得到的只是

  

致命错误:在解包可选值时意外发现nil

我做错了什么?

2 个答案:

答案 0 :(得分:1)

consoleOuput被声明为可选(?),其中可能包含nil。尽管如此,你还是强行打开它(!)而不是检查nil。这是导致您致命错误的原因#34;。每当你强行打开一个可选项时,你都会冒这个错误。

你可以尝试更像这样的东西:

outputText.stringValue = myDelegate.consoleOutput ?? ""

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

??被称为" Nil Coalescing Operator"。

答案 1 :(得分:0)

尝试设置此行:let output:String = NSString(data: data, encoding: NSUTF8StringEncoding)!至:let output: String = "Test"如果这样可以消除错误,那么您知道NSString(data: data, encoding: NSUTF8StringEncoding)返回nil,因此数据管道出现问题。