2015-10-25 3 views
11

С iOS 9 все мои UIImagePickerControllers теперь сбой, если я нажимаю на представленные изображения. сообщения об ошибке:UIImagePickerController сбой при силе касания?

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

Я думаю, это ошибка яблока, но есть никому работа вокруг?

ответ

7

Обходной путь: https://gist.github.com/nolanw/bd0a8997632fe92a9f83 (предупреждение: проверяет метод на частном классе, что, вероятно, должно сделать вас тошнотворным). Прикрепите эти файлы в своем проекте, затем вызовите MSDPreventImagePickerCrashOn3DTouch откуда-то (например, -applicationDidFinishLaunching:…).

Проблема заключается в том, что частный класс с именем PUPhotosGridViewController вызывает метод UIViewControllerPreviewing на своем суперклассе, который не реализует этот метод. Обходной путь проверяет метод оскорбления и пытается вызвать исходную реализацию, но он проглатывает исключение, поэтому мы не сбой. Надеюсь, сделав это так, если/когда он будет исправлен, обходное решение не повлияет на это исправление.

+0

Waow! Невероятно, это работает отлично. Если я хочу быть придирчивым, это оставляет предупреждение «Undeclared selector msd_previewingContext: viewControllerForLocation:». Большое спасибо! –

+0

@ AirXygène Хорошая добыча; Я обновил суть, чтобы подавить предупреждение. – nolanw

+0

, даже если вы упомянули, что swizzling метод в частном классе должен сделать кого-то тошнотворным, я хочу добавить для хорошей оценки, что люди должны использовать решение OTHER и просто писать расширение для 'UICollectionViewController' и' UIViewController'. Помимо более безопасной и лучшей практики, ее также меньше строк кода, которые вы должны добавить! И вы лучше спать по ночам;) –

12

Ответ - непонятный способ исправить проблему. И вы можете получить отказ от Apple с помощью Private API.

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, но что произойдет, когда Apple выпустит исправление? Разве это не будет какой-то конфликт между методом расширения и методом класса? Разве исключение nolanw исключения больше безопаснее в будущем? –

+0

Если приложение Apple записывает исправление, реализуя этот метод в PUPhotoGridViewController, оно будет отменено. Поскольку PUPhotoGridViewController является SUBclass UICollectionViewController, и все функции базового класса, такие как расширения, будут переопределены. Вы можете попробовать это https://gist.github.com/antigp/bc88dc1ba1238ceff8e0 – Antigp

+0

Да, понятно. Благодарю. –

Смежные вопросы