Как отключить диспетчер отмены NSTextView от NSDocument? - PullRequest
0 голосов
/ 14 июля 2020

У меня есть NSDocument в формате, не редактируемом напрямую, это описание чего-то в XML. У NSWindow есть связанный с ним контроллер представления настроек, который отлично манипулирует данными в документе, отмена работает, как ожидалось, сохраняет и т.д. c. Теперь также в NSWindow есть NSTextView, в который пользователь может вводить какой-то текст, но он не является частью содержимого документа, он используется только как временный текст. Конечно, я хочу поддержать отмену и для этого текста, поэтому у меня в Interface Builder для этого NSTextView включена галочка «Отменить», и отмена работает нормально.

Теперь начинается проблема: NSDocument помечается как грязный при изменении NSTextView. Поскольку это временный текст, я не хочу, чтобы пользователя приставали к сохранению изменений в документе, которые на самом деле не являются частью документа.

Как мне отсоединить NSTextView от цепочки ответчиков, ведущей вверх к экземпляру диспетчера отмены NSDocument? Простое предоставление нового экземпляра NSUndoManager не решает эту проблему, потому что он просто поднимается по цепочке респондентов до NSDocument.

extension InputViewController: NSTextViewDelegate {
    func undoManager(for view: NSTextView) -> UndoManager? {
        return myUndoManager
    }
}

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Я почти уверен, что вам нужно переопределить свойство undoManager контроллера представления окна, а не делегата текстового поля.

Однако, чтобы просто сделать ваш документ / окно навсегда недоступным для редактирования все, что вам нужно сделать, это переопределить либо свойство documentEdited, чтобы оно всегда возвращало false, либо переопределить updateChangeCount, чтобы оно игнорировало запросы на запись изменений.

0 голосов
/ 15 июля 2020

Благодаря комментарию Джеймса Буканека о переопределении updateChangeCount, я смог сделать что-то вроде этого в моем подклассе NSDocument:

    override func updateChangeCount(_ change: NSDocument.ChangeType) {
        if !suppressChangeCount {
            super.updateChangeCount(change)
        } else {
            suppressChangeCount = false
        }
    }

Таким образом, разрешив отмену / повтор выполнения в моем InputViewController обработчик кода ключа без загрязнения документа.

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