2015-10-25 5 views
11

iOS 9の場合、提示された画像を強制的にタッチすると、私のUIImagePickerControllersのすべてがクラッシュするようになりました。 エラーメッセージは次のとおりです。UIImagePickerControllerが強制接触でクラッシュしますか?

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSObject previewingContext:viewControllerForLocation:]: unrecognized selector sent to class 0x1a0752020' 

私はこれは、Appleのバグですが、誰も仕事を周りに持っていると思いますか?

答えて

7

ここに回避策があります:https://gist.github.com/nolanw/bd0a8997632fe92a9f83(警告:私的なクラスのメソッドをswizzleすると、あなたが気になるはずです)。プロジェクトにこれらのファイルを貼り付けてからMSDPreventImagePickerCrashOn3DTouchに電話してください(例:-applicationDidFinishLaunching:…)。

プライベートクラスPUPhotosGridViewControllerは、そのメソッドを実装していないスーパークラスでUIViewControllerPreviewingメソッドを呼び出しているようです。この問題を回避する方法では、元の実装を呼び出そうとしますが、クラッシュすることはありません。うまくいけば、このようにすることで、もしそれが固定されたら、回避策はその修正に影響しません。

+0

ワウ!信じられないほど十分に、これは正常に動作しています。 私が気楽になりたい場合、これは "宣言されていないセレクタmsd_previewingContext:viewControllerForLocation:"という警告を残します。 ありがとうございます! –

+0

@AirXygène良いキャッチ;警告を表示しないように要点を更新しました。 – nolanw

+0

でも、プライベートクラスのメソッドを誰かが気まぐれにする必要があると言われても、私は人々が他のソリューションを使い、単に 'UICollectionViewController'と' UIViewController'の拡張を書くべきであるという良い指標を追加したいと思います。より安全で実践的であることに加えて、追加する必要のあるコード行も少なくて済みます!そして、あなたは夜によく寝るでしょう;) –

12

答えはissuseを解決するための明確な方法ではありません。プライベートAPIを使用してAppleから拒否権を取得することもできます。

PUPhotoGridViewControllerは単純なUICollectionViewControllerであり、実装されていないメソッドの拡張子を記述することができます。

extension UICollectionViewController: UIViewControllerPreviewingDelegate { 
    public func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { 
     return nil; 
    } 

    public func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) { 

    } 
} 
+0

私はあなたが公然のクラスでのみ "遊ぶ"のが好きです - 私はAppleによって拒否されませんでしたが、Appleが修正をリリースするとどうなりますか?拡張機能のメソッドとクラスメソッドとの間に何らかの矛盾はないでしょうか? nolanwは例外のキャッチではなく、将来の安全ですか? –

+0

appleがPUPhotoGridViewControllerにこのメソッドを実装することで修正された場合、それはオーバーライドされます。 PUPhotoGridViewControllerはUICollectionViewControllerのSUBclassであり、拡張などの基本クラスのすべての関数がオーバーライドされるためです。あなたはこれを試すことができますhttps://gist.github.com/antigp/bc88dc1ba1238ceff8e0 – Antigp

+0

はい、分かりました。ありがとう。 –

関連する問題