Цель высокого уровня: .
Я пытаюсь создать текстовый редактор, который может просматривать файлы уценки.
Текущий статус :
Чтение / запись текстовых файлов работает нормально.
Проблема:
Добавление / замена NSAttributedString в textView затруднительно.
Вот мой код: импорт Импорт какаоDown // md преобразование lib
class Document: NSDocument {
var string = ""
var ref: NSTextView
override init() {
self.ref = NSTextView()
super.init()
}
override class var autosavesInPlace: Bool {
return true
}
override func makeWindowControllers() {
// Returns the Storyboard that contains your Document window.
let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
// creates a new windowController on the fly when a new file is openend. That creates the new window...
let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("Document Window Controller")) as! NSWindowController
// the windowController contains a viewController
self.addWindowController(windowController)
// create reference to the textView inside the window we just created by opening the new file...
let vc = windowController.contentViewController as! ViewController
// THIS DOES NOT SEEM TO WORK
self.ref = vc.textView
}
override func data(ofType typeName: String) throws -> Data {
// SAVE BACK TO FILE
if let vc = self.windowControllers[0].contentViewController as? ViewController {
return vc.textView.string.data(using: String.Encoding.utf8) ?? Data()
}
else {
return Data()
}
}
override func read(from data: Data, ofType typeName: String) throws {
do {
let s = try String(data: data, encoding: .utf8)
let down = Down(markdownString: s!)
let fancyString = try! down.toAttributedString()
//self.ref.insertText(fancyString, replacementRange: NSRange(location: 0, length: 10))
self.ref.insertText("It might be working...", replacementRange: NSRange(location: 0, length: 10))
}
}
}
Вот что, я думаю, происходит: Чтобы построить этот код, мне нужно присвоить NSTextView()
экземпляр self.ref
вinit()
.Я пытаюсь заменить этот textView на текстовое представление, созданное в makeWindowControllers()
, но это не работает.
Я ожидаю увидеть It might be working...
в новом окне, но вместо этого просто вижу пустоеtextView.
Есть мысли?
ОБНОВЛЕНИЕ с решением
Спасибо @Willeke за поднятие этого вопроса.Я предположил, что makeWindowControllers()
был вызван первым.Оказывается, что read()
вызывается, а затем makeWindowControllers()
вызывается.
Так что я могу назначить var fancyString:NSAttributedString = NSAttributedString(string: "hello")
в качестве переменной класса.Затем установите fancyString
из содержимого файла в read()
и обновите textView в makeWindowControllers
следующим образом:
// the proper way to insert an NSAttributedString into a textView
vc.textView.insertText(fancyString, replacementRange: NSRange(location: 0, length: 10))