Сохранение с NSDocument во втором ViewController - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь просто сохранить с помощью NSDocument в RTF.Код работает нормально, но когда я пытаюсь сохранить в контроллере представления, который не является начальным дочерним элементом оконного контроллера, он выдает ошибку из модального слова «Документ« »не может быть сохранен как« ». '

Как я могу сохранить файл во втором контроллере вида?

             Window Controller
                    |
           Login View Controller

          |                |
SidebarViewContoller   ViewController1
                                 |
                                  TableViewController 2 Replaces VC1  
                                   Save TextView in this VC

Я хочу иметь возможность записывать данные в My NSDocument из textView в ViewController2 и сохранять их на рабочем столе.например, в Pages

Вот код

// Document.swift

class Document: NSDocument {

var text = NSAttributedString()
var documentViewController: DocumentViewController? {
    return windowControllers[0].contentViewController as? DocumentViewController
}


override init() {
    super.init()
    // Add your subclass-specific initialization here.
}

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)
    let windowController = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("Document Window Controller")) as! NSWindowController
    self.addWindowController(windowController)
}

override func data(ofType typeName: String) throws -> Data {
    // Save the text view contents to disk
if let textView = documentViewController?.textView {
        let rangeLength = textView.string.count

    textView.breakUndoCoalescing()
    let textRange = NSRange(location: 0, length: rangeLength)
    if let contents = textView.rtf(from: textRange) {
            return contents
        }
    }
    throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
}

override func read(from data: Data, ofType typeName: String) throws {
    if let contents = NSAttributedString(rtf: data, documentAttributes: nil) {
        text = contents
    }
}

// SecondViewController

override func viewDidAppear() {
    let document = self.view.window?.windowController?.document as!   Document
    textView.textStorage?.setAttributedString(document.text)
}

1 Ответ

0 голосов
/ 28 декабря 2018

Как вы настроили вещи в своем приложении, вы не сможете поместить все содержимое NSDocument в текстовое представление.Предположим, у вас есть 10 элементов в табличном представлении и выбор элемента заполняет текстовое представление некоторым текстом.Вы не сможете иметь NSDocument для каждого из 10 элементов табличного представления внутри одного документа.

Вам нужно будет создать структуру данных, представляющую текстовый файл.Придумайте главу в книге или сцену в сценарии.В вашем подклассе NSDocument у вас будет массив этих структур данных.Когда вы сохраняете документ, вы сохраняете его как упаковщик файлов, который представляет собой каталог файлов, который в Finder выглядит как один файл.В оболочке файла будет один текстовый файл для каждого элемента в табличном представлении.Обратитесь к следующей статье, чтобы узнать больше об оболочках файлов:

Работа с оболочками файлов в Swift

Теперь вам нужно знать, как заполнить текстовое представление, когдавыбор таблицы меняется.Это болезненно делать с раскадровками Mac, потому что контроллер табличного представления и контроллер текстового представления являются отдельными сценами.Реализуйте метод делегата tableViewSelectionDidChange в контроллере представления для табличного представления.Используйте свойство parent, чтобы получить контроллер разделения представления.Используйте контроллер разделенного представления, чтобы получить контроллер текстового представления.Передайте выбранную строку в контроллер текстового представления и используйте его, чтобы получить правильный текстовый файл для отображения в текстовом представлении.

Контроллер разделенного представления должен хранить ссылку на NSDocument.Используйте свойство parent для доступа к контроллеру разделенного представления из контроллера текстового представления.Имея доступ к контроллеру разделенного представления, вы можете получить доступ к документу, чтобы заполнить текстовое представление содержимым текстового файла, соответствующего выбранному элементу в табличном представлении.

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