取消打印活动后应用程序崩溃
问题描述:
我的应用程序支持打印。如果用户取消打印机选项模态视图控制器,应用程序的某个地方崩溃在苹果的代码的_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
的自定义子类,但即使我没有自定义它使用超类,我也会发生这种崩溃。
要进行复制,请使用单个按钮创建单个视图项目,然后将该按钮链接到使用上述代码片段作为其主体的操作。然后点击按钮,点击活动视图控制器中的打印图标,然后点击打印机选项视图控制器中的取消按钮。崩溃。有任何想法吗?
答
这几乎肯定是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)
只要财产是由强烈举行你的实例并没有被释放,它不会崩溃。
遵循Xcode 8.1中的步骤,使用iPhone目标,并在9.3.5设备上运行,我没有看到崩溃。 –
感谢您检查此事,Phillip。我使用Xcode 8.1和iPhone 7模拟器,部署目标设置为10.1。当我将其改为9.3时,我仍然每次都会在模拟器中发生崩溃。我尝试过使用我的设备(运行10.1.1的iPhone 6 Plus),并且崩溃并不总是发生 - 这是间歇性的。如果我将部署目标设置为10.1,那么每次我的设备都会崩溃,但是如果将部署目标设置为9.3,则不会总是发生。在我的发货应用中,用户在运行10.1.1的iPhone和iPad上遇到此故障。也许这是一个iOS错误,我需要提交一个雷达。 –
我没有很好的想法,但我确实发现了一个奇怪的观察。如果我为活动控制器分配了完成处理程序('UIActivityViewControllerCompletionWithItemsHandler'),它将在模拟程序**中第一次通过序列**停止崩溃。但是,如果我重复UI操作而不重新启动...崩溃。 –