Я изучаю Swift последние пару дней, и, похоже, я попал в камень.Показать консольный вывод в NSScrollView и NSTextView в 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
, как это:
EDIT: Изменен предыдущий код, но все еще возникает ошибка:
textView.string = myDelegate.consoleOutput
Я хочу, чтобы вывод терминала отображался в пределах NSViewText
(или NSTextField
, или NSScrollView
, NSClipView
? не уверен какой), в реальном времени. То, что я не могу сделать, это найти способ манипулировать содержанием NSTextView
«s, потому что, когда я бегу, я получаю следующее сообщение об ошибке:
fatal error: unexpectedly found nil while unwrapping an Optional value
Любая помощь будет оценена.
Ahh! Поэтому мы не можем использовать 'IBOutlet', так как мы используем' IBAction'! Понял. Но теперь, когда я изменяю его на '@ BIOutlet var textView: NSTextView!' И использую 'textView.string = myDelegate.consoleOutput', я получаю« фатальную ошибку: неожиданно найденный nil при развертывании необязательного значения » – Jack44
Совершенно иная. IBOutlet - это всего лишь тег, который сообщает Interface Builder и среде, что это переменная, предназначенная для получения ссылки на объект, определенный в раскадровке или nib, когда для вашего контроллера просмотра загружен раскадровка или nib (например, xib). IBAction - это тег, который указывает, что это функция обработчика событий, которая была настроена для вызова через инструменты Interface Builder. IBOutlet находится в разделе декларации и не исполняемых, только префиксы IBAction. – clearlight