Сбои приложения после отмены печати
Мое приложение поддерживает печать. Если пользователь отменяет контроллер режима просмотра "Параметры принтера", приложение вылетает где-то в коде Apple с сообщением _WebTryThreadLock(bool) ... Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...
Я сузил его до следующего кода:
let itemProvider = UIActivityItemProvider(placeholderItem: "message")
let activityItems = [ itemProvider,
UIMarkupTextPrintFormatter(markupText: "test") ]
let activityController = UIActivityViewController(activityItems: activityItems,
applicationActivities: nil)
self.present(activityController, animated: true, completion: nil)
Если я удалю itemProvider
от activityItems
массив, крах уходит. В моем приложении у меня есть собственный подкласс UIActivityItemProvider
, но даже если я использую суперкласс, не настраивая его, я получаю этот сбой.
Для репликации создайте проект с одним представлением с помощью одной кнопки и свяжите кнопку с действием, которое использует приведенный выше фрагмент кода в качестве основного текста. Затем нажмите кнопку, нажмите значок "Печать" в контроллере представления активности, а затем нажмите кнопку "Отмена" в контроллере представления параметров принтера. Краш. Есть идеи?
1 ответ
Это почти наверняка ошибка в коде Apple.
После отладки я пришел к выводу, что это связано с освобождением UIMarkupTextPrintFormatter
пример.
Таким образом, в качестве обходного пути вы можете использовать форматтер как свойство в вашем классе:
var printFormatter = UIMarkupTextPrintFormatter(markupText: "test")
Тогда используйте это так:
let itemProvider = UIActivityItemProvider(placeholderItem: "message")
let activityItems = [itemProvider, self.printFormatter]
let activityController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
self.present(activityController, animated: true, completion: nil)
Пока свойство строго поддерживается вашим экземпляром и не освобождается, оно не будет аварийно завершено.