2016-12-06 19 views
2

私のアプリは印刷をサポートしています。私はからitemProviderを削除した場合印刷アクティビティのキャンセル後にアプリケーションがクラッシュする

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) 

:ユーザーがプリンタオプションモーダルビューコントローラをキャンセルした場合、アプリは、私は次のコードにそれを絞り込むまし_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...

のメッセージとAppleのコードのどこかでクラッシュactivityItemsアレイでは、クラッシュがなくなります。私のアプリケーションではUIActivityItemProviderのカスタムサブクラスがありますが、カスタマイズしないでスーパークラスを使用しても、このクラッシュが発生します。

レプリケートするには、1つのボタンで1つのビューのプロジェクトを作成し、上記のコードスニペットを本体として使用するアクションにボタンをリンクします。次に、ボタンをタップし、アクティビティビューコントローラのプリントアイコンをタップしてから、プリンタオプションビューコントローラでキャンセルボタンをタップします。クラッシュ。何か案は?

+0

Xcode 8.1でiPhoneターゲットを使用し、9.3.5デバイスで実行している手順に従って、クラッシュしません。 –

+0

これをチェックしていただきありがとうございます、フィリップ。私はiPhone 7シミュレータでXcode 8.1を使用しています。展開ターゲットは10.1に設定されています。私はそれを9.3に変更すると、毎回シミュレータでクラッシュすることがあります。私は自分のデバイス(iPhone 6 Plus 10.1.1を実行中)で試してみましたが、クラッシュが常に起こるとは限りません - 断続的です。デプロイメントターゲットを10.1に設定すると、デバイスは毎回クラッシュしますが、デプロイメントターゲットを9.3に設定しても、必ずしもそうなるとは限りません。私の船積みアプリでは、10.1.1を実行しているiPhoneとiPadでこのクラッシュが発生しています。おそらくそれはiOSのバグであり、私はレーダーを提出する必要があります。 –

+0

私は良いアイデアはありませんが、私は1つの奇妙な観察を見つけました。アクティビティコントローラの補完ハンドラ( 'UIActivityViewControllerCompletionWithItemsHandler')を割り当てると、シミュレータ**でシーケンス**で初めてクラッシュすることを止めます。しかし、再起動せずにUIアクションを繰り返すとクラッシュします。 –

答えて

4

これは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) 

インスタンスが解放されず、クラッシュしません。

関連する問題