Ошибка утверждения при использовании NSCollectionView с QLPreviewView

Я использую NSCollectionView, где каждый NSCollectionViewItem использует QLPreviewView, чтобы получить рендеринг содержимого файла.

(Это попытка файлового браузера для изображений и других файлов с возможностью предварительного просмотра.)

Первоначально это работает нормально.

Однако, как только элементы коллекции используются повторно, я получаю ошибку утверждения (как в 10.13, так и в 10.14):

[QL] Assertion failure (unreachable code) - [… MyPreviewView activated … doc:[QLPreviewDocument …]] is already activated

По-видимому, прежде чем я смогу повторно использовать NSCollectionViewItem, ранее использовавшийся QLPreviewItem должен быть каким-то образом переведен в состояние inactive. Как я могу это сделать?

Я пытался отправить сообщение close экземпляру QLPreviewView, но это не имеет значения.

Я также не получаю вызов Dealloc для моего подкласса QLPreviewView, который предполагает, что на объект по-прежнему ссылается что-то еще, возможно, QLPreviewDocument, который затем запутывается в изменении состояния.

Я сделал демонстрационный проект доступным на github: https://github.com/tempelmann/NSCollectionViewWithQLPreview

Чтобы проверить: запустите его, затем прокрутите вниз. При достижении элементов с 50 по 60 будет запущено утверждение.


person Thomas Tempelmann    schedule 02.03.2019    source источник


Ответы (1)


Исправление состоит в том, чтобы установить для свойства shouldCloseWithWindow QLPrewiewView значение NO.

Я подозреваю, что это говорит контроллеру за кулисами не привязываться к структурам более высокого уровня, то есть говорит ему оставаться самодостаточным.

Таким образом, добавление этой строки в код, устанавливающий новый объект MyPrewiewView в файле ViewController.m примера кода, предотвращает ошибку:

qlView.shouldCloseWithWindow = NO;
person Thomas Tempelmann    schedule 03.03.2019