OSX Swift: редактор местозаполнителя при ошибке исходного файла в NSTextView
Я получаю сообщение об ошибке "Редактор заполнителя в исходном файле". Я пытаюсь получить доступ к тексту моего NSTextView, но, похоже, я делаю это неправильно.
@IBAction func cancelButton(sender: AnyObject) {
dismissViewController(self)
}
@IBAction func saveButtonHandler(sender: AnyObject) {
let Name: String! = nameField.stringValue;
let Time: String! = timeField.stringValue;
let Yum: String! = yumField.stringValue;
let Instruct = (instructionField.textStorage as NSAttributedString!).string;
let recipe = Recipe(name: Name, time: Time, yum: Yum, type: foodType, instructions: Instruct)
dismissViewController(self)
}
Проблема исходит от линии
let Instruct = (instructionField.textStorage as NSAttributedString!).string;
Что я делаю неправильно?
1 ответ
Во-первых, если вы используете раскадровки или XIBS, вы не можете иметь выход на NSTextView
, Обходной путь должен создать Outlet к целевому текстовому представлению, содержащему NSScrollView
, Поэтому убедитесь, что вы храните ссылки на instructionField
как таковой, и он содержит вид прокрутки как таковой:
@IBOutlet weak var scrollView : NSScrollView!
var instructionField : NSTextView {
get {
return scrollView.contentView.documentView as! NSTextView
}
}
Далее вы не получаете доступ к тексту, содержащемуся в текстовом представлении, с помощью textStorage
, Правильная реализация для получения текста, содержащегося в instructionField
как следует:
instructionField.string
который имеет тип String?
,
Теперь, если вы хотите получить NSAttributedString
от instructionField
Вы можете сделать это так, чтобы избежать принудительного развертывания необязательного:
guard let str = instructionField.string else { /* else */ }
guard let attrStr = str as? NSAttributedString else { /* else */ }
в заключение
Окончательное исправление вашей проблемной строки может выглядеть примерно так:
guard let Instruct = instructionField.string else { /* else */ }