Swift Могу ли я назначить NSTextview глобальным, который еще не был создан? - PullRequest
0 голосов
/ 17 октября 2018

Цель высокого уровня: .
Я пытаюсь создать текстовый редактор, который может просматривать файлы уценки.

Текущий статус :
Чтение / запись текстовых файлов работает нормально.

Проблема:
Добавление / замена 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))

1 Ответ

0 голосов
/ 18 октября 2018

makeWindowControllers вызывается после read(from data: Data, ofType typeName: String).Присвойте приписанную строку свойству Document и добавьте текст в текстовое представление в makeWindowControllers.

Сведения: Поток сообщений в архитектуре документа, открытие документа в Руководство по программированию приложений для Mac для Mac

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...